C# 使用工厂获取注入对象

C# 使用工厂获取注入对象,c#,.net,dependency-injection,structuremap,C#,.net,Dependency Injection,Structuremap,使用工厂方法检索注入的对象是一种好的做法,还是只使用DI框架中的工厂方法就可以了 我使用的是结构映射,我应该只使用ObjectFactory.GetInstance();,或者我应该创建一个工厂类并在这个类中调用ObjectFactory.GetInstance();?因为如果我调用ObjectFactory.GetInstance();在我的课程中,我将创建与DI框架的耦合?对不起,如果我是无知的,我对这个概念是陌生的。谢谢 如果您已经在使用DI框架,为什么要在框架已经提供工厂模式的情况下重新

使用工厂方法检索注入的对象是一种好的做法,还是只使用DI框架中的工厂方法就可以了


我使用的是结构映射,我应该只使用ObjectFactory.GetInstance();,或者我应该创建一个工厂类并在这个类中调用ObjectFactory.GetInstance();?因为如果我调用ObjectFactory.GetInstance();在我的课程中,我将创建与DI框架的耦合?对不起,如果我是无知的,我对这个概念是陌生的。谢谢

如果您已经在使用DI框架,为什么要在框架已经提供工厂模式的情况下重新实现工厂模式?此外,您不应该在应用程序的业务层中创建与DI框架的依赖关系。在这里,您应该使用接口和抽象类进行抽象。DI框架只应在最高级别使用,例如在GUI中执行较低层的管道,并选择合适的数据访问层。

工厂方法在需要对实例进行细粒度控制时非常有用。不过,您不应该直接依赖于容器本身,而应该将工厂方法作为依赖项注入。下面是一个例子来说明这一点:

public class SomeController
{
    private Func<ISomeService> _serviceFactory;
    public SomeController(Func<ISomeService> serviceFactory)
    {
         _serviceFactory = serviceFactory;
    }

    public void DoSomeWork()
    {
       var service = _serviceFactory();
       ....
    }
}
公共类控制器
{
私人Func_服务工厂;
公共控制器(Func服务工厂)
{
_服务工厂=服务工厂;
}
公共工程
{
var服务=_serviceFactory();
....
}
}
StructureMap注册代码如下所示:

var container = new Container(cfg =>
    cfg.For<ISomeService>().Use(() => new SomeServiceImpl())
);
var容器=新容器(cfg=>
cfg.For()。使用(()=>new SomeServiceImpl())
);

我同意Darin的观点,让DI框架完成它的工作,而不是复制功能。