无参数的Autofac工厂实例化

时间:2015-12-16 12:03:51

标签: c# asp.net-mvc autofac

我是使用Autofac的新手,如果这是一个愚蠢的问题,请道歉。

假设我有一个带有无参数构造函数的抽象类FooBase,以及一个名为Foo的实现。

在我的AP.Net MVC5客户端代码中,我希望能够创建一个FooBase类型对象的实例(我已经设置了Autofac来将其解析为Foo)。此实例的生命周期和范围仅限于我的方法,我希望以类似于调用工厂方法的方式执行此操作。

目前我正在使用DependencyResolver,但似乎有点做作。有更简单的方法吗?

例如,这是目前的样子......

public void SendMessage()
{
    var foo = DependencyResolver.Current.GetService<FooBase>();
    Debug.WriteLine(foo.Name);
}

我正在寻找更像这样的东西......

public void SendMessage()
{
    var foo = IoC.Resolve<FooBase>();
    Debug.WriteLine(foo.Name);
}

2 个答案:

答案 0 :(得分:2)

我认为您可以使用delegate factories

首先在要在运行时构建的类型中声明委托工厂:

public class TestService
{
    public delegate TestService Factory();
    //other methods....
}

然后你可以将工厂注入任何其他依赖项,例如:

public class ExampleController
{
    private TestService.Factory _factory;
    public ExampleController(TestService.Factory factory)                
    {
        _factory = factory;
    }

    public OtherMethod()
    {
        var serviceInstance = _factory();
    }
}

希望这有帮助!

答案 1 :(得分:0)

您可以简单地注入一个工厂,而不是使用服务定位器which is an anti-pattern,它允许您在需要时创建依赖关系的实例。最简单的方法是注入Func<FooBase>。 Autofac supports this natively。如果您只注册FooBase,则AutoFac知道如何注入Func<FooBase>。这是一个例子:

public class TestClass
{
    private Func<FooBase> m_FooBaseFactory;

    public TestClass(Func<FooBase> factory)
    {
        m_FooBaseFactory = factory;
    }

    public void TestMethod()
    {
        var foo = m_FooBaseFactory();
        //consume foo here
    }
}