标签: inversion-of-control

什么是温莎城堡,我为什么要关心?

我是一名长期的Windows开发人员,在win32和早期的COM上已经开始了.我从2001年开始使用.Net,因此我对C#和CLR非常流利.在我开始参与Stack Overflow之前,我从未听说过Castle Windsor.我已经读过温莎城堡"入门"指南,但它没有点击.

教这个老狗的新技巧,并告诉我为什么我应该将Castle Windsor整合到我的企业应用程序中.

c# dependency-injection castle-windsor inversion-of-control

187
推荐指数
1
解决办法
7万
查看次数

有人可以解释Microsoft Unity吗?

我一直在阅读有关Unity(依赖注入,控制反转)的MSDN文章,但我认为我需要用简单的术语(或简单的例子)来解释它.我熟悉MVPC模式(我们在这里使用它),但我还不能真正掌握这个Unity的东西,我认为这是我们应用程序设计的下一步.

c# dependency-injection inversion-of-control unity-container

153
推荐指数
6
解决办法
10万
查看次数

通过构造函数或属性设置器进行依赖注入?

我正在重构一个类并为它添加一个新的依赖项.该类目前正在构造函数中使用其现有依赖项.因此,为了保持一致性,我将参数添加到构造函数中.
当然,对于单元测试,有一些子类加上甚至更多,所以现在我正在玩改变所有构造函数的游戏来匹配,并且它需要很长时间.
这让我觉得使用带有setter的属性是获得依赖关系的更好方法.我认为注入的依赖项不应该是构造类实例的接口的一部分.您添加了一个依赖项,现在所有用户(子类和任何直接实例化您的用户)突然知道它.这感觉就像打破了封装.

这似乎不是现有代码的模式,所以我希望找出一般的共识是什么,构造函数与属性的优缺点.使用属性设置器更好吗?

dependency-injection inversion-of-control

145
推荐指数
9
解决办法
3万
查看次数

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

我试图让Unity管理我的对象的创建,我希望有一些在运行时才知道的初始化参数:

目前,我能想到的方法是在接口上使用Init方法.

interface IMyIntf {
  void Initialize(string runTimeParam);
  string RunTimeParam { get; }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它(在Unity中)我会这样做:

var IMyIntf = unityContainer.Resolve<IMyIntf>();
IMyIntf.Initialize("somevalue");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,runTimeParamparam是在运行时根据用户输入确定的.这里的简单案例只返回值,runTimeParam但实际上参数将类似于文件名,初始化方法将对文件执行某些操作.

这会产生许多问题,即该Initialize方法在界面上可用并且可以多次调用.在实现中设置一个标志并在重复调用时抛出异常Initialize似乎很笨重.

在解析我的界面时,我不想知道有关实现的任何信息IMyIntf.但是,我想要的是知道这个接口需要一定的一次初始化参数.有没有办法以某种方式注释(属性?)具有此信息的接口,并在创建对象时将它们传递给框架?

编辑:更多地描述了界面.

interface-design dependency-injection ioc-container inversion-of-control unity-container

145
推荐指数
3
解决办法
7万
查看次数

企业库Unity与其他IoC容器

使用Enterprise Library Unity与其他IoC容器(Windsor,Spring.Net,Autofac ..)的优缺点是什么?

.net c# enterprise-library inversion-of-control unity-container

134
推荐指数
2
解决办法
5万
查看次数

必须依赖注入以牺牲封装为代价吗?

如果我理解正确,依赖注入的典型机制是通过类的构造函数或通过类的公共属性(成员)注入.

这暴露了注入的依赖性并违反了封装的OOP原则.

我在确定这种权衡时是否正确?你是如何处理这个问题的?

另请参阅下面我对自己问题的回答.

oop encapsulation dependency-injection inversion-of-control

123
推荐指数
7
解决办法
9531
查看次数

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

(与此问题相关,EF4:为什么在启用延迟加载时必须启用代理创建?).

我是DI的新手,所以请耐心等待.我知道容器负责实例化我所有已注册的类型,但为了做到这一点,它需要引用我的解决方案中的所有DLL及其引用.

如果我没有使用DI容器,我就不必在我的MVC3应用程序中引用EntityFramework库,只需引用我的业务层,它将引用我的DAL/Repo层.

我知道在一天结束时所有的DLL都包含在bin文件夹中,但我的问题是必须通过VS中的"添加引用"显式引用它,以便能够发布包含所有必需文件的WAP.

dependency-injection castle-windsor inversion-of-control

114
推荐指数
3
解决办法
2万
查看次数

使用IoC进行单元测试

如何将IoC容器用于单元测试?使用IoC在大型解决方案(50多个项目)中管理模拟是否有用?有经验吗?任何C#库在单元测试中都能很好地使用它吗?

c# unit-testing mocking inversion-of-control

97
推荐指数
3
解决办法
4万
查看次数

当程序员说"代码对接口而不是对象"时,他们的意思是什么?

我已经开始了很长时间的艰苦探索,学习并将TDD 应用到我的工作流程中.我认为TDD与IoC原理非常吻合.

在SO中浏览了一些TDD标记问题之后,我认为对接口而不是对象进行编程是一个好主意.

您能提供简单的代码示例,说明这是什么,以及如何在实际使用案例中应用它?简单的例子对我(以及其他想要学习的人)掌握概念至关重要.

非常感谢.

.net c# tdd inversion-of-control

78
推荐指数
3
解决办法
2万
查看次数

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

我理解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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,依赖项是Constructor Injected.现在提出几个问题.

  1. 让您的实体依赖于诸如ShipQuoter之类的外部类别是否被视为不良做法?如果我正确理解定义,消除这些依赖性似乎会导致我陷入贫血领域.

  2. 使用IoC容器来解决这些依赖关系并在需要时构建实体是不好的做法吗?是否有可能做到这一点?

感谢您的任何见解.

entities dependency-injection castle-windsor ioc-container inversion-of-control

77
推荐指数
1
解决办法
9120
查看次数