在运行时检索接口的实现时,使用依赖注入有什么好处?

时间:2013-10-13 21:32:44

标签: c# reflection dependency-injection

public List<IBusinessObject> RetrieveAllBusinessObjects()
{
    var businessObjectType= typeof(IBusinessObject);

    List<Type> implementationsOfBusinessObject = AppDomain.CurrentDomain.GetAssemblies()
         .SelectMany(s => s.GetTypes())
         .Where(businessObjectType.IsAssignableFrom).ToList();

    return implementationsOfBusinessObject.Select(t =>(IBusinessObject)Activator.CreateInstance(t)).ToList();
}

我被堆栈溢出的用户建议我应该检查依赖注入作为上述snippit的解决方法。这有什么好处?

稍微概述一下情景:

我们的数据库几乎没有存储过程,所以我们已经开始为更复杂的表实现C#业务对象。由于我们希望很快就能切换数据库,这似乎是最好的选择。必须在运行时使用反射加载所有业务对象以帮助管理它们。所有这些业务对象都实现了IBusinessObject接口。

使用依赖注入的建议来自question

编辑:

  1. RetrieveAllBusinessObjects方法位于接口后面的类中,因此可以直接测试

  2. 如果更改了任何内容,我们会使用AutoFac。我们不使用单独的配置文件。

  3. -

2 个答案:

答案 0 :(得分:1)

而不是使用上面的代码,您只需使用在应用程序的配置文件中配置的DI,但有时您也可以在方法中修饰属性或参数,然后将自动注入(通过映射集)当请求访问该对象时,或者在params中调用的方法中调用它时,以编程方式或通过配置方式启动。

它也使得它更容易测试,你可以创建实现接口的不同具体类型,然后不必重新编译代码,只需通过配置文件和中提琴轻弹映射...所有工作

答案 1 :(得分:0)

DI会在不必编写代码的情况下执行上述操作,因此您可以减少引入错误的机会。

DI为您提供了许多好处,例如

  • 更容易测试单个代码单元。可以模拟依赖关系,因此可以限制正在测试的代码
  • 易于理解代码中的依赖关系。依赖关系通常会在某些地方注入,通常是构造函数。
  • 链接到1 /以上,因为您现在应该定义代码之间的接口,当您的需求发生变化时你需要重写一个组件,你可以更高的信心,它将与你现有的代码库一起工作。

其他人可能会更好地描述其他好处,但您需要根据自己的需要对其进行评估。