Tag: 反转控制

如何避免dependency injection构造函数的疯狂?

我发现我的构造函数开始看起来像这样: public MyClass(Container con, SomeClass1 obj1, SomeClass2, obj2…. ) 不断增加参数列表。 由于“容器”是我的dependency injection容器,为什么我不能这样做: public MyClass(Container con) 为每个class? 有什么缺点? 如果我这样做,感觉就像我正在使用一个荣耀的静态。 请分享你对IoC和dependency injection疯狂的想法。

为什么我需要一个IoC容器而不是简单的DI代码?

我一直在使用dependency injection (DI)一段时间,注入或者在构造函数,属性或方法。 我从来没有觉得需要使用控制反转 (IoC)容器。 然而,我读得越多,我感受到社区使用IoC容器的压力越大。 我使用了.NET容器,如StructureMap , NInject , Unity和Funq 。 我仍然看不到IoC容器将如何使我的代码受益/改进。 我也害怕在工作中使用容器,因为我的许多同事都会看到他们不懂的代码。 他们中的许多人可能不愿意学习新技术。 请说服我,我需要使用一个IoC容器。 当我和我的同事在工作中交谈时,我会用这些论据。

为什么不使用IoC容器来parsing实体/业务对象的依赖关系?

我了解DI背后的概念,但我只是了解不同的IoC容器可以做什么。 似乎大多数人主张使用IoC容器来连接无状态服务,但是如何将它们用于实体这样的有状态对象呢? 无论是对还是错,我通常都会对自己的实体进行行为,即使这种行为需要外部的类。 例: public class Order : IOrder { private string _ShipAddress; private IShipQuoter _ShipQuoter; public Order(IOrderData OrderData, IShipQuoter ShipQuoter) { // OrderData comes from a repository and has the data needed // to construct order _ShipAddress = OrderData.ShipAddress; // etc. _ShipQuoter = ShipQuoter; } private decimal GetShippingRate() { return _ShipQuoter.GetRate(this); } } 正如你所看到的,依赖关系是注入构造函数。 […]

什么是控制反转?

控制反转(或IoC)在第一次遇到时可能会相当混乱。 它是什么? 它解决了什么问题? 什么时候适合,什么时候不适合?

dependency injection(DI)“友好”库

我正在思考一个C#库的devise,这将有几个不同的高级function。 当然,这些高级函数将尽可能地使用SOLID类devise原则来实现。 因此,可能会有定期直接使用消费者的类别,以及那些更常见的“最终用户”类别的“支持类别”。 问题是,devise库的最佳方式是什么? DI不可知论 – 尽pipe为一个或两个常见DI库(StructureMap,Ninject等)添加基本的“支持”似乎是合理的,但我希望消费者能够使用任何DI框架的库。 非DI可用 – 如果图书馆的消费者没有使用DI,图书馆应该尽可能地容易使用,从而减less用户为创build所有这些“不重要”的依赖而必须做的工作量他们想要使用的“真实”类。 我目前的想法是为通用的DI库(例如,一个StructureMapregistry,一个Ninject模块)以及一个非DI的集合类或工厂类提供一些“DI注册模块”,并且包含与这些less数工厂的耦合。 思考?

每个Web请求一个DbContext …为什么?

我一直在阅读大量文章,解释如何设置entity framework的DbContext以便只使用各种DI框架为每个HTTP Web请求创build和使用一个。 为什么这是一个好主意呢? 使用这种方法你有什么好处? 是否有某些情况下这是一个好主意? 有没有事情,你可以使用这种技术,你不能做每个存储库方法调用实例化DbContext ?

是否有初始化通过DI容器创build的对象的模式

我想让Unity来pipe理我的对象的创build,我想有一些初始化参数,直到运行时才知道: 目前唯一能想到的方法是在界面上使用Init方法。 interface IMyIntf { void Initialize(string runTimeParam); string RunTimeParam { get; } } 然后使用它(在统一)我会这样做: var IMyIntf = unityContainer.Resolve<IMyIntf>(); IMyIntf.Initialize("somevalue"); 在这种情况下, runTimeParam参数是在运行时根据用户input确定的。 这里的小事情只是返回runTimeParam的值,但实际上这个参数是类似文件名的,初始化方法会对文件做一些事情。 这就产生了一些问题,即Initialize方法在接口上可用,可以多次调用。 在实现中设置一个标志,并抛出exception重复调用Initialize似乎是笨重的。 在我解决我的界面的时候,我不想了解IMyIntf的实现。 我所需要的是,这个接口需要一定的初始化参数。 有没有办法用这个信息注释(属性?)接口,并在创build对象时将它们传递给框架? 编辑:描述更多的接口。

Ioc / DI – 为什么我必须引用入口应用程序中的所有层/组件?

(与这个问题相关, EF4:为什么启用延迟加载时必须启用代理创build? )。 我是新来的DI,所以忍受着我…我明白,容器负责实例化所有我注册的types,但为了这样做,它需要参考我的解决scheme中的所有DLL和它们的引用。 如果我没有使用DI容器,我不需要在我的MVC3应用程序中引用EntityFramework库,只能引用我的DAL / Repo层的业务层。 我知道在一天结束的时候,所有的DLL都包含在bin文件夹中,但是我的问题是通过VS中的“添加引用”显式引用它,以便能够发布具有所有必要文件的WAP …

哪个.NET依赖注入框架值得研究?

哪个C#/ .Net依赖注入框架值得研究? 你怎么能说他们的复杂性和速度。