我是使用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);
}
答案 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
}
}