2017-07-17 135 views
0

我試圖避免使用服務定位器。前面的代碼如下所示:避免使用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依賴關係?

回答

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 
{ 
    // ... 
}