避免使用ServiceLocator

时间:2017-07-17 15:40:46

标签: c# generics autofac

我正在努力避免使用服务定位器。上面的代码如下:

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`或类似的。您能否以优雅的方式分享您的想法,创建一种创建存储库的通用方法,而无需使用Service Locator和IoC依赖项的介绍?

1 个答案:

答案 0 :(得分:1)

您是否正在应用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
{
    // ...
}