C#依赖注入和策略模式

Dav*_*rke 3 c# dependency-injection

我在一个MVC3项目中使用Munq作为DI容器.我有一个服务层,可以从存储库中检索DTO.根据DTO中的属性,我需要使用两种策略之一来对DTO执行计算.我可以在容器中注册一个命名类型,例如

Container.Register<ICalculation>("Type1", c => new Type1Calculation);
Container.Register<ICalculation>("Type2", c => new Type2Calculation);
Run Code Online (Sandbox Code Playgroud)

然后我可以在尝试实例化适当的策略时直接引用容器,例如

var calc = Container.Resolve<ICalculation>(dto.ServiceType);
Run Code Online (Sandbox Code Playgroud)

但这让我依赖于容器本身以及相关的耦合和测试问题.我需要传递给服务构造函数,这将允许我获得正确的计算,但不依赖于容器?我是否应该通过工厂,因此依赖是在工厂而不是服务类?

Ant*_*lev 5

不确定Munq,但Autofac允许你传递Funcs,所以你可以完全跳过所有的工厂:

public class Foo
{
    public Foo(Func<string, IBar> barFactory) { }
}
Run Code Online (Sandbox Code Playgroud)

检查Munq是否允许此类行为.

否则 - 是的,你将不得不诉诸手写工厂来提供另一层次的间接.