避免使用ServiceLocator
问题描述:
我试图避免使用服务定位器。前面的代码如下所示:避免使用ServiceLocator
public class UnitOfWork
{
private T CreateRepository<T>(T repo)
where T :
IRepository
{
return ServiceLocator.Current.GetInstance<T>();
}
}
我正在使用Autofac作为IoC。我不想t wanna use
ILifetimeScope or
IContainer`或类似。你能分享你的想法,如何以优雅的方式实现创建一个通用的方法来创建存储库,而无需使用服务定位器和引入IoC依赖关系?
答
无论你申请的Service Locator anti-pattern,取决于在哪里这个代码是located,因为:
封装在一个Composition Root DI容器不是一个服务定位器 - 这是一个基础结构组件。
换句话说,如果你UnitOfWork
放置内构图根,你是不是应用服务定位器反模式和你的代码是好的。
当然,这将使应用程序代码无法呼叫CreateRepository
,因为解决方案中的组合根depends on all other code,而没有任何内容取决于组合根。
然而,这个问题很容易通过从这个类中提取一个接口并将该接口放置在需要使用的接口中来解决。例如:
// Core layer
public interface IUnitOfWork
{
T CreateRepository<T>() where T : IRepository;
}
// Composition Root
public class UnitOfWork : IUnitOfWork
{
// ...
}