Tag: inversion of control

如何在使用Autofac WcfIntegration时处理构造函数exception

有没有办法处理WCF服务的构造函数抛出的exception,当该构造函数接受依赖项时, 它是IoC容器(在本例中为AutoFac)导致exception的依赖实例化 ? 考虑具有以下构造函数的WCF服务: public InformationService(IInformationRetriever informationRetriever) { _informationRetriever = informationRetriever; } //… the service later makes use of the injected InformationRetriever 该服务使用AutoFac WcfIntegration和AutofacWebServiceHostFactory (这恰好是一个RESTful服务)。 依赖关系在服务的global.asax.cs中注册,即: builder.RegisterType() .As() 现在, InformationRetriever实现在其构造函数中执行一些检查,以确保一切就绪,以便能够完成其工作。 当它在此阶段发现问题时,它会抛出exception。 但是,我不希望服务的调用者接收AutoFacexception: An exception was thrown while invoking the constructor … on type InformationRetriever 我有效地试图测试: 鉴于 InformationService正在运行 当我调用GetSomeInformation()方法时 并且无法实例化InformationRetriever 然后我想返回一个友好的错误消息 并记录实际的exception 这是我的设计问题,还是有一个已知的模式来克服或防止这个问题? 我一直在寻找,无法找到有关此类问题的任何信息。

你能在Windsor Container中注册一个类型的现有实例吗?

在Windsor IOC容器中是否可以注册一个我已经拥有实例的类型,而不是让容器创建它?

使用Castle Windsor通过调用者类型依赖Log4Net Logger和检索记录器

我在log4net周围有一个瘦的包装器,我试图使用类型的调用类通过使用Castle.Windsor从log4net.LogManager获取一个记录器。 public class Foo: IFoo { private readonly ICommonLog _logger; public Foo(ICommonLog logger) { _logger = logger; } public void FooBar() { _logger.Info(“Enter FooBar Method”); } } public class CommonLog : ICommonLog { private readonly log4net.ILog _logger; public CommonLog(Type loggerType) { _logger = log4net.LogManager.GetLogger(loggerType); } public void Info(string message) { _logger.Info(message.Cleanse()); } // … } […]

创建对象的线程中的dependency injection

如果我有一个从主应用程序启动的线程。 在此线程中生成事件。 每次生成事件时都会创建一个对象。 在该对象中需要依赖,因此我想注入该对象。 如何将此依赖性传递给创建的对象? 我是否需要向下传递depandancy(并让在线程中工作的类知道依赖性)或者是否有更好的方法来执行此操作? 我正在使用Unity btw。

配置Ninject以返回结果列表

我正在使用Ninject解决依赖关系,它一直在游泳,直到现在。 在这个例子中,我实际上需要一个基于存储在App.config中的数据初始化的对象列表。 但是,Ninject不断返回一个空列表。 下面的代码段是我尝试过的一个例子。 我已经为一些上下文包含了类层次结构的构造函数。 public ServiceSchedulerBuilder(IList textExportServices) { _textExportService = textExportServices; } public TextExportService(IHotFolderManager hotFolder) { _hotFolder = hotFolder; } public HotFolderManager(string baseFolderPath, string defaultFileSearchPattern) { //Some IO } //In a Ninject AppModule… Kernel.Bind<IList>().ToMethod(ctx => { var services = new List(); foreach (var device in GetDevicesByEnvironment()) { var service = ctx.Kernel.Get(new ConstructorArgument(“hotFolder”, ctx.Kernel.Get( new […]

单个应用程序消耗多个IoC注册表并存在冲突

我有一个应用程序通过两个单独的UnitOfWork类与单独的数据库进行通信。 我正在使用StructureMap来构建我的类。 单独地,每个构建和运行正确。 但是,一旦我在“ Web应用程序 ”中使用两个容器注册表,我就会遇到冲突。 两个注册管理机构都从它们的通用框架引用相同的DbContext (基础)类。 但是,每个注册表都有自己的具体DbContext类(inheritance自DbContext )。 问题是… 我消耗两个注册表的那一刻,最后是“胜利”……并且应用了错误的CONCRETE Dbcontext类(进入第一个注册表)。 DbContext多个实例应用于Repository引用。 问:如何确保在我的注册表中应用正确的CONCRETE DbContext? 问:如何确保在我的注册表中单独安装DbContext? 我尝试了各种方法但没有成功……感谢您的帮助。 例如… REGISTERY’ONE’包含: For().Use(); For().Use(); For(typeof(ICompositeRepository)).Use(typeof(DbRepository)).Ctor().Is(); For(typeof(IRepository)).Use(typeof(DbRepository)).Ctor().Is(); 注册’两个’包含: For().Use(); For().Use(); For(typeof(ICompositeRepository)).Use(typeof(DbRepository)).Ctor().Is(); For(typeof(IRepository)).Use(typeof(DbRepository)).Ctor().Is();

使用IoC链接层,将较低的回调设置为较高并避免循环引用

我有一个场景,我需要一个较低层由上层控制,就像一个木偶大师拉弦。 由于一些内部事件不时生成,因此下层也将回调上层。 我正在使用SimpleInjector,我将ILower注入到Upper构造函数中。 我不能将Upper注入Lower,因为它会导致循环引用。 相反,我有一个寄存器回调函数来链接这两个层。 但是,我必须使用空检查分散我的代码。 有没有更好的方法或不同的架构来实现这种对象的链接? // an interface that transport can callback from transport to client public interface ILowerToUpperCallback { void ReplyA(); void ReplyB(); } // transport interface that client calls public interface ILower { void Test1(); void Test2(); void RegisterCallback(ILowerToUpperCallback callback); } public class Upper : ILowerToUpperCallback { private readonly ILower lower; […]

中断的IoC链

我正在构建一个使用抽象工厂模式的应用程序,以允许运行时根据它对标识请求的响应来确定我的IHardwareDevice的哪个子类。 我可能会创建Hardware1或Hardware2。 出现问题的原因是我想在这些IHardwareDevice对象中使用State模式,我想让IoC容器创建State。 有没有一种好方法可以在不直接调用IoC容器来解析用于保护IHardwareDevice的State对象的情况下执行此操作? 或者,我是以错误的方式思考这个问题的? 因为我的Factory几乎是这个库的入口点,所以可以让这个Factory句柄实例化容器以便在库中使用吗? 我计划让客户端应用程序实例化容器,然后使用它来访问所需的库部分,例如Factory。 我打算使用Windsor作为IoC容器,但是如果需要,我可以在项目的早期阶段进行切换。

没有服务定位器的工厂模式

我目前只是在努力编写一个不依赖服务位置的工厂类。 我能想到的唯一其他选择是使用构造函数注入来注入所有可能的实例,但这可能会导致意外,因为类是通过引用传递的。 一旦可能的提供商数量增加,它也可能会变得昂贵和混乱。 提供者本身是完全复杂的类,它们有自己的依赖关系,因此手动构造是不可能的。 更新了服务位置示例: public class ProviderFactory : IProviderFactory { private readonly IProviderConfigurationService _providerConfigurationService; public enum SearchType { Foo, Bar } public ProviderFactory(IProviderConfigurationService providerConfigurationService) { _providerConfigurationService = providerConfigurationService; } public Collection GetProviderInstances(SearchType searchType) { // Provider configuration service will read a XML/DB store to retrieve list of search providers applicable for a search type […]

NInject扩展工厂

在阅读了NInject v3上的新文档以及如何使用Factory Extension之后 ,显然我仍然没有完全得到它,因为我的代码抛出exception到处… 我得到了这个例外,如果人们愿意,我可以粘贴整个东西,但我会尽量保持简短。 激活IDeployEntityContainer时出错没有匹配的绑定可用,并且该类型不可自我绑定。 这是我的代码…… Ninject Bind Module类 class MyNinjectModule : NinjectModule { public override void Load() { … Bind().ToFactory(); Bind().To(); … } } 使用工厂的类 class DeployController : IDeployController { private readonly IDeployEntityFactory _entityFactory; public DeployController(…, IDeployEntityFactory entityFactory) { … } public void Execute() { … //I get the Exception on this line… […]