我正在努力避免使用服务定位器。上面的代码如下:
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依赖项的介绍?
答案 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
{
// ...
}