2

保持分離我跟以下項目分層應用:DI與資源庫和服務在不同的DLL,關注

  • DAL(使用的EntityFramework帶庫)
  • DAL.Model(包含實體,並通過所有其他引用)
  • 服務
  • UI(在WPF)

基礎信息庫嚕KS這樣的:

public abstract class RepositoryBase<T> where T : class 
{ 
    private readonly MyContext context; 
    private readonly IDbSet<T> dbSet; 

    protected RepositoryBase(MyContext dataContext) 
    { 
     context = dataContext; 
     dbSet = context.Set<T>(); 
    } 

    protected MyContext Context 
    { 
     get { return context; } 
    } 

    **And a series of virtual methods for Add, Delete, etc. 
} 

所有庫擴展這一項,如:

public class MarketRepository : RepositoryBase<Market> 
{ 
    public MarketRepository(MyContext dataContext) : base(dataContext) 
    { 

    } 

    public IEnumerable<Market> GetAllMarkets() 
    { 
     return this.Context.Markets.ToList<Market>(); 
    } 
} 

的服務是這樣的:

public class MarketService 
{ 
    IMarketRepository _marketRepository; 

    public MarketService(IMarketRepository marketRepository) 
    { 
     _marketRepository = marketRepository; 
    } 

    public IEnumerable<Market> GetAllMarkets() 
    { 
     return _marketRepository.GetAllMarkets(); 
    } 
} 

我想實現的是,UI層僅使用DI(現在我正在使用Unity)對服務層,服務層僅引用DAL層(以及所有模型,實體所在的實體)的引用。

的問題是,在我的UI容器我只是想這樣做

unity.RegisterType<IMarketService, MarketService>(); 

,並沒有做到這一點,以及對倉庫,因爲那時的UI層會對依賴DAL層。

我想增加一個參數的構造函數的服務類,如:

public MarketService() : this(new MarketRepository(*What would I put here?)) { } 

但後來我失去的界面給人的抽象,而且我不知道該怎麼做的存儲庫需要的MyContext作爲參數;如果我通過一個新的,那麼我需要引用DAL。

我是否應該更改我的存儲庫以在構造函數中創建新的MyContext,而不是將其作爲參數獲取?

我該如何重構我的架構以使其工作正常並且最小的依賴關係?

+0

爲什麼要創建庫? DbSet已經是一個存儲庫。 –

回答

1

那麼,我相信它取決於引導程序來配置應用程序的更高級別的依賴關係。因爲它通常是UI項目,所以如果需要引用其他程序集。如果你不喜歡你的UI項目來管理它,那麼比創建一個引導程序項目負責讓你的應用程序運行並將你的UI類分離到另一個。

+0

我寧願避免再有一個額外的項目來處理這個問題......但我同意,如果我沒有找到任何其他方式,我會將所有對UI的引用添加爲最後一個資源。仍然必須有更好的方式來做我所暴露的事情。 – chuwik

+1

我不認爲這裏有一個「更好的方法」。正如Arthur所說,你必須創建一個獨立的項目來管理依賴佈線,或者讓其中一個現有的層完成。大多數情況下,推薦的方法(包括撰寫有關該主題的完整書籍的人 - 請參閱http://blog.ploeh.dk/2011/07/28/CompositionRoot.aspx)將該邏輯放入應用程序中入口點通常相當於表示層。 – guillaume31

+0

感謝guillaume31,這就是我要去的! – chuwik

0

您的IoC容器應該支持使用外部配置文件中的字符串進行依賴注入。這樣你就不會硬編碼映射。 Structuremap很好地完成了這個工作,所以我相信其他的IoCs會。

+0

是的,我可以在app.config中設置它。但是,我仍然需要用戶界面來引用DAL程序集,這正是我想要避免的。 – chuwik

+0

它不一定是一個app.config。您可以定義一種配置方法。總會有一些地方需要做膠水工作。現在人們越來越習慣於最佳實踐。事實上,這實際上阻礙了人們的發展進程。 – SolidRegardless

0

創建實例時添加外部依賴關係作爲參數是要走的路。
我想你應該讓自己更熟悉配置Unity的不同方式,以便解決依賴關係。
您能否詳細說明爲什麼在使用依賴注入框架時創建存儲庫?

+0

我在數據訪問層中創建存儲庫,作爲訪問數據的抽象;這些服務使用它們來操縱數據。這樣我就可以嘲笑和測試這些存儲庫,並以較少的麻煩來改變它的實現。 – chuwik

0

配置DI時,應遵循相同的模式 - UI引導程序初始化服務,服務初始化DAL。 (使用autofac或ninject,你可以使用模塊來實現這一點,並且你應該模擬模塊)。

在僞像

//ui 
void UILayer.ConfigureUnity(unity) 
{ 
    ServiceLayer.ConfigureUnity(unity) 
} 
//services 
void ServiceLayer.ConfigureUnity(unity) 
{ 
    DAL.ConfigureUnity(unity) 
    unity.RegisterType<IMarketService, MarketService>(); 

} 
//dal 
void DAL.ConfigureUnity(unity) 
{ 
    unity.RegisterType<IMarketRepository, MarketRespository>(); 
    unity.RegisterType<MyContext, MyContext>(); //not sure exact syntax - just register type for 'new Type()' activator. 
}