Tag: dependency injection

使用Autofac注册基类的实现,以通过IEnumerable传入

我有一个基类,以及一系列inheritance自此类的其他类: (请原谅过度使用的动物类比) 公共抽象类Animal {} 公共课狗:动物{} 公共类猫:动物{} 然后我有一个依赖于IEnumerable public class AnimalFeeder { private readonly IEnumerable _animals; public AnimalFeeder(IEnumerable animals ) { _animals = animals; } } 如果我手动做这样的事情: var animals = typeof(Animal).Assembly.GetTypes() .Where(x => x.IsSubclassOf(typeof(Animal))) .ToList(); 然后我可以看到这会让Dog和Cat回归 但是,当我尝试连接我的Autofac时: builder.RegisterAssemblyTypes(typeof(Animal).Assembly) .Where(t => t.IsSubclassOf(typeof(Animal))); builder.RegisterType(); 实例化AnimalFeeder ,没有Animal传入构造函数。 我错过了什么吗?

如何在不强迫用户使用库的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参数但不具有单个实例但每次都允许新实例。 这怎么可能?

PostSharp替代

我只是想了解PostSharp,说实话,我认为这太棒了。 但有一件事我很难在PostSharp方面无法完成纯dependency injection(不是服务定位器),也许是因为编译时编织的结果。 来自PHP背景,Symfony有JMSAopBundle ,它仍然允许dependency injection它的拦截器。 .Net有一些具有相同function的库吗? 或者我错过了PostSharp的东西?

策略模式与dependency injection

策略模式与dependency injection有何不同? 即以下是您可以使用策略模式执行的操作: class Foo{ private readonly ISortAlgo _sortAlgo; public Foo(ISortAlgo sortAlgo) { _sortAlgo = sortAlgo; } public void Sort() { _sortAlgo.sort(); } } 使用DI你可以做同样的事情,基本上你可以有构造函数,setter,接口等注入。 它会产生与战略模式相同的效果。 我知道DI也有其他原则,例如松耦合,可测试性,布线等。 在实施方面,我没有看到太大的区别。 策略模式和DI有什么区别?

.net核心dependency injection是否支持Lazy

我试图使用通用的Lazy类来实例化.net核心dependency injection扩展的昂贵类。 我已经注册了IRepo类型,但我不确定Lazy类的注册是什么样的,或者它是否支持。 作为一种解决方法,我使用了这种方法http://mark-dot-net.blogspot.com/2009/08/lazy-loading-of-dependencies-in-unity.html 配置: public void ConfigureService(IServiceCollection services) { services.AddTransient(); //register lazy } 控制器: public class ValuesController : Controller { private Lazy _repo; public ValuesController (Lazy repo) { _repo = repo; } [HttpGet()] public IActionResult Get() { //Do something cheap if(something) return Ok(something); else return Ok(repo.Value.Get()); } }

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

我们正在重新设计一些遗留软件以使其更易于测试,并决定使用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,文件还是神奇地从帽子中拉出来的。 我认为我们的设计有问题,但不确定如何修复它。 关于如何进步的任何想法?

在结构图3中,HybridHttpOrThreadLocalScoped的等价物是什么?

使用structuremap 2.6.4.1,我的容器配置如下: existingContainer.Configure(expression => { expression.For() .HybridHttpOrThreadLocalScoped() .Use(container => { var store = container.GetInstance(); return store.OpenSession(); }); } 结构图3中不存在HybridHttpOrThreadLocalScoped ,所以我的问题是,structuremap 3中的等效配置是什么?

Json.NET如何在反序列化期间执行dependency injection?

当我有一个没有默认构造函数的类,即使用dependency injection来传递其依赖项时, Newtonsoft.Json可以创建这样的对象吗? 例如: public class SomeFoo { private readonly IFooDependency _dependency; public SomeFoo(IFooDependency dependency){ if(dependency == null) throw new ArgumentNullException(“dependency”); _dependency = dependency; } public string Data { get; set; } public int MoreData { get; set; } public void DoFoo(){ Data = _dependency.GetFooData(); MoreData = _dependency.GetMoreFooDate(); } } 在序列化过程中,我只关心存储Data和MoreData(以及对象的类型,但暂时不要复杂化)。 现在,为了反序列化,我可以调用类似的东西 var obj = […]

为什么在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,请使用完整的容器。 我错了吗? 为什么?