如何使用Autofac在Web API项目中手动解析服务。我有一个名为Foo的课程。 Foo由Activator.CreateInstance实例化,由另一个我无法控制的类实现,这意味着它将调用无参数的构造函数。
我有一些需要在Foo类中注入的属性。现在,由于调用类调用无参数构造函数,我需要手动解析这些属性。
public class Foo
{
private IService Instance;
public Foo()
{
//How do I get the per request lifetime scoped dependency resolver here
IService = (Dependency Resolver).Resolve<IService>();
}
}
答案 0 :(得分:0)
由于您无法控制此类的构造,因此唯一的方法是通过服务定位器。
虽然服务定位器is considered an anti-pattern有限制,例如您强制使用此类模式的限制。
您必须创建一个名为ServiceLocator的静态类。它应该有一些方法来注册服务(或者它应该包装DI容器,这是你想要的),以及其他定位服务的方法。
查看Locator
类here以获取示例定位器。但是,在您的情况下,您只需要一个包装AutoFac容器的类似类。因此,在此类Service Locator类中创建一个静态方法来接收和包装DI容器。
关于生命周期,您可以在服务定位器中创建一个特殊方法,允许您使用特殊生命周期类型解析服务(通过适当调用DI容器)。
在项目中使用服务定位器会产生诱惑,在应该使用依赖注入的情况下(几乎所有时间)使用它。确保仅在这种情况下使用服务定位器。