在项目库中使用 autofac
using autofac inside project library
我在 MVC 项目中使用 autofac。
我有另一个核心业务项目(dll 库)。
在这个核心中,我想使用 autofac 来检索一些接口。
现在,如果我在 MVC 应用程序中,我可以使用
DependencyResolver.Current.GetService<IMyService>();
用于检索服务。
但是在库中,如何在某些 class 声明中不将其作为 属性 传递来检索服务?
DependencyResolver 仅在 MVC 项目中定义。
这是最佳做法吗?
我发现您的方法存在以下问题:
DepdencyResolver
is defined in System.Web.Mvc,并且您的 BL-project 不应引用该程序集。
- 您正在使用 Service Locator Pattern, which is declared an Anti-Pattern。
避免在 BL-project
中使用 System.Web.Mvc-dependency
我发现一个具体的Locator<T>
是一个可行的方法,它绕过"open to everything"-和static - 服务定位器模式问题:
public interface ILocator<T> // defined in some *CORE* project
{
T Locate();
}
public class AutofacLocator<T> : ILocator<T> // defined and injected in your *FRONTEND* project
{
public AutofacLocator(ILifetimeScope lifetimeScope)
{
this.LifetimeScope = lifetimeScope;
}
public virtual T Locate()
{
var service = this.LifetimeScope.Resolve<T>();
return service;
}
}
这可以简单地注册为 open generic:
builder.RegisterGeneric(typeof(AutofacLocator<>))
.As(typeof(ILocator<>))
.InstancePerDependency();
因此,您可以创建自己的解析器,而不是依赖于静态 DependencyResolver.Current
,并将其注入 BL-class' ctor:
public class SomeBusinessLogic
{
public SomeBusinessLogic(ILocator<SomeDependency> someDependencyLocator)
{
}
}
使用Ctor-Injection代替服务定位器模式
另一种方法是,简单地将对 T
实例的依赖定义为 ctor-parameter,然后让 Autofac 构建您的 BL-class:
public class SomeBusinessLogic // defined in your *BL* project
{
public SomeBusinessLogic(SomeDependency someDependency)
{
}
}
var someBusinessLogic = DependencyResolver.Current.GetService<SomeBusinessLogic>(); // in your *FRONTEND* project
我在 MVC 项目中使用 autofac。 我有另一个核心业务项目(dll 库)。 在这个核心中,我想使用 autofac 来检索一些接口。
现在,如果我在 MVC 应用程序中,我可以使用
DependencyResolver.Current.GetService<IMyService>();
用于检索服务。 但是在库中,如何在某些 class 声明中不将其作为 属性 传递来检索服务?
DependencyResolver 仅在 MVC 项目中定义。
这是最佳做法吗?
我发现您的方法存在以下问题:
DepdencyResolver
is defined in System.Web.Mvc,并且您的 BL-project 不应引用该程序集。- 您正在使用 Service Locator Pattern, which is declared an Anti-Pattern。
避免在 BL-project
中使用 System.Web.Mvc-dependency我发现一个具体的Locator<T>
是一个可行的方法,它绕过"open to everything"-和static - 服务定位器模式问题:
public interface ILocator<T> // defined in some *CORE* project
{
T Locate();
}
public class AutofacLocator<T> : ILocator<T> // defined and injected in your *FRONTEND* project
{
public AutofacLocator(ILifetimeScope lifetimeScope)
{
this.LifetimeScope = lifetimeScope;
}
public virtual T Locate()
{
var service = this.LifetimeScope.Resolve<T>();
return service;
}
}
这可以简单地注册为 open generic:
builder.RegisterGeneric(typeof(AutofacLocator<>))
.As(typeof(ILocator<>))
.InstancePerDependency();
因此,您可以创建自己的解析器,而不是依赖于静态 DependencyResolver.Current
,并将其注入 BL-class' ctor:
public class SomeBusinessLogic
{
public SomeBusinessLogic(ILocator<SomeDependency> someDependencyLocator)
{
}
}
使用Ctor-Injection代替服务定位器模式
另一种方法是,简单地将对 T
实例的依赖定义为 ctor-parameter,然后让 Autofac 构建您的 BL-class:
public class SomeBusinessLogic // defined in your *BL* project
{
public SomeBusinessLogic(SomeDependency someDependency)
{
}
}
var someBusinessLogic = DependencyResolver.Current.GetService<SomeBusinessLogic>(); // in your *FRONTEND* project