Tag: ioc container

将参数传递给Castle Windsor中的UsingFactoryMethod

如何将动态参数传递给UsingFactoryMethod注册? 例如,我想写一些类似的东西: container.Register( Component.For() .UsingFactoryMethod(return DoSomethingAndReturnInstance(paremeter))); 我需要在运行时发送参数,如下所示: container.Resolve(new { parameter = value }); 怎么做到呢?

UnityContainer和内部构造函数

我有一个内部构造函数的类,并希望从Unity(2.0)解析它。 public class MyClass { internal MyClass(IService service) { } } 然后我在做 _container.Resolve(); 当我这样做时,我有一个例外 Exception is: InvalidOperationException – The type MyClass cannot be constructed. IService已注册,唯一的问题是构造函数是内部的。 我真的希望这个类是公开的,但我希望它只能通过工厂创建(我实际上是在调用container.Resolve() )。 有没有办法让Unity看到内部构造函数? 像InternalsVisibleTo或者什么?

如何在不强迫用户使用库的IOC容器的情况下编写库

简短的问题是:鉴于图书馆保证使用特定的IOC容器作为其内部,当应用程序使用该库时,给定应用程序保证使用IOC容器连接其依赖关系,如果两个容器不同,给出它们怎么能一起玩得好吗? 方案是,应用程序具有依赖于库中类型的类。 因此,当应用程序容器尝试构建此类时,它需要知道如何解析库中的类型。 这是一个冗长的问题: 在SO之前,这个问题似乎确实以不同的forms和forms被问过,但我似乎无法找到我需要的答案,因此我将使用一个假设的_over_simplified_具体示例。 我们希望编写一个用于日志记录的库,用户可以在其解决方案中将其作为包包含在内,以便开箱即用地获取日志记录function。 库公开的公共接口是.. public interface ILogger {} public interface ITarget {} 具体实现是 internal class Logger: ILogger { public Logger(ITarget target) {}} internal class FileTarget : ITarget {} 要求是,如果用户包含我们的包并定义了一个具有ILogger类型属性的类或者具有类型ILogger的ctor参数,那么我们的库负责将该接口的具体实现注入用户定义的类。 默认情况下,注入的logger将转到文件系统进行日志记录,因为注入ILogger实现的FileTarget的默认实现是我们库的FileTarget 。 如果用户决定编写实现ITarget接口的类,那么我们的库将使用它来注入Logger类而不使用其默认的FileTarget实现。 所以我想certificate的是,他们在这里是双向依赖。 我们的库依赖于用户的程序集,因为它需要扫描用户的程序集以加载任何扩展点(即ITarget实现),并在任何默认实现之前将它们注入到自己的对象中。 用户的程序集依赖于库,因为如果用户选择使用ILogger接口作为依赖项来定义类,那么该用户对象应该获得对我们的库在运行时提供的该接口的具体引用。 简单的解决方案是,如果用户和我们的库都使用相同的IOC容器,那么问题就解决了。 但这是一个强有力的假设。 我想做的是 使用IOC容器和最符合库要求的库,在我的例子中是Ninject。 在运行时以某种方式为用户提供了一种机制,让用户可以通过某些API调用我的库来确保Ninject被激活并扫描用户的程序集,并连接所有考虑所有扩展点的所有内容。 到目前为止这么好,它是完全可以实现的,但这里是棘手的部分。 如果用户也在使用Ninject,那么问题会自动解决,因为Ninject已经知道如何解决生活在我们库中的接口。 但是如果用户决定使用他/她选择的IOC容器怎么办? 我几乎想要在库中使用这样的接口定义某种子容器function public interface IDependencyResolvingModule { T Get(); []T GetAll(); […]

Simple Injector将硬编码值传递给构造函数

在Simple Injector中,我可以执行以下操作: container.RegisterSingle(() => new AuctionContext( new Uri(“http://localhost:60001/AuctionDataService.svc/”))); 我在这里做的是说当找到IAuctionContext时,用这个新的AuctionContext替换它。 问题是,通过调用RegisterSingle ,只会使用一个AuctionContext实例。 我希望它能够传递如上所述的Uri参数但不具有单个实例但每次都允许新实例。 这怎么可能?

在城堡 – 温莎的多个装饰员模式

我们正在重新设计一些遗留软件以使其更易于测试,并决定使用Dependency-Injection和Castle.Windsor来帮助我们。 首先,我们的目标:*许多装饰器都在数据流上工作。 *装饰器的多种组合是可能的,并且每种情况下的根节点可能需要从不同的地方获取数据。 从技术上讲,我们的设计如下: interface IUpdateableValue { T Get(); }; 我们有三组要检索的数据,包含许多组件,都实现了IUpdateableValue()(伪代码): JsonParser( Decompressor( Decrypter(decryptionKey FileCache(filename, HttpWebDownloader(url)))) XmlParser( Decompressor( Decrypter(decryptionKey2 FileCache(filename2, HttpWebDownloader(url2)))) 我无法将设计融入像Castle-Windsor这样的DI框架中。 我怀疑其中一些可能由命名实例处理,但这似乎有点臭这种用法。 这个想法是,例如JsonParser和XmlParser实例的“用户”不知道(或关心)数据是来自HttpUrl,文件还是神奇地从帽子中拉出来的。 我认为我们的设计有问题,但不确定如何修复它。 关于如何进步的任何想法?

为什么在IWindsorContainer上使用IKernel?

我在几个代码示例中看到人们使用了IKernel而不是使用IWindsorContainer 。 为什么是这样? 这是一个例子: http : //docs.castleproject.org/(S(kwaa14uzdj55gv55dzgf0vui))/ Windsor.Windsor-tutorial-part-two-plugging-Windsor-in.ashx 在上面的例子中它引起了我的兴趣,因为我添加了一个subresolver Container.Kernel.Resolver.AddSubResolver( new CollectionResolver(Container.Kernel, true)); 这将允许我注入集合…但它没有工作。 我发现因为只使用了IKernel ,它无法使用Windsor的全部function。 为什么有人想要在整个容器上使用内核? 我想如果您打算实施Windsor,请使用完整的容器。 我错了吗? 为什么?

在WPF中使用Unity

我让Unity 2.0在App.xaml.cs中运行良好,可以在该类中注册和解析。 我的问题是关于最佳做法。 我有许多用户控件和其他类,还需要解决一些相同和新的接口实现。 问题是无法访问我在App.xaml.cs中创建的Unity容器。 我不能使用构造函数或属性注入来传递容器引用。 太多了(这是一个大项目) 用户控件通过xaml添加 项目中有几个非常松散相关的“模块”可以共享相同的容器配置。 我宁愿不在每个需要访问容器的对象的配置文件中重新创建容器。 在同一组件的各种“模块”中需要同一个容器作为服务时,是否有任何最佳实践建议? 谢谢。

使用Simple Injector进行方法级别的属性拦截

使用Unity,我可以快速添加基于属性的拦截 public sealed class MyCacheAttribute : HandlerAttribute, ICallHandler { public override ICallHandler CreateHandler(IUnityContainer container) { return this; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { // grab from cache if I have it, otherwise call the intended method call.. } } 然后我这样注册Unity: container.RegisterType( new ContainerControlledLifetimeManager(), new Interceptor(), new InterceptionBehavior()); 在我的存储库代码中,我可以选择性地装饰要缓存的某些方法(具有可以为每个方法单独定制的属性值): [MyCache( Minutes = 5, CacheType […]

当你没有对容器的引用时,是否有可能让Castle Windsor解决属性依赖性问题?

我们有一个解决方案,其中有多个项目代表我们的应用程序层。 例如 域 数据 逻辑 WebUI中 我们的Castle Windsor容器从我们的Web层引用,然后我们将这些依赖项级联到层。 例如… // In Domain public interface IFooRepository { void DoSomething(); } // In Data public class FooRepository : IFooRepository { public void DoSomething() { // Something is done } } // In Logic public class MyThingManager { private readonly IFooRepository fooRepository; public MyThingManager(IFooRepository fooRepository) { this.fooRepository = […]

如何在autofac中混合装饰器?

我希望能够将装饰器与Autofac混合搭配。 例如,假设我有一个由Repository类实现的IRepository接口。 我可以拥有以下装饰器:RepositoryLocalCache,RepositoryDistributedCache,RepositorySecurity,RepositoryLogging …,你得到了ideea。 基于配置设置,我想用所需的装饰器来装饰基本实现。 那可以是无,一个或多个装饰器。 我熟悉注册一个装饰器的语法,或者按固定顺序注册它们的链,但我怎样才能使这个动态化呢?