我使用Unity作爲依賴注入引擎。它包含'repository'和'manager'類的接口/類。這些存儲庫負責從/到DB中獲取/保存/更新數據,管理員知道與其他組件/類的對象關係。依賴容器:如何實例化對象實例
有工廠實現來獲取依賴容器的實例(每個請求有1個實例)。當任何存儲庫/管理器類被實例化時,它接收依賴性容器作爲構造器參數,並且可以在需要時創建所有其他管理器/存儲庫。
有2種方式來創建業務實體:
- 當數據從DB倉庫中取出,創建對象的實例,並適當DB數據初始化它們,等之間的「容器」字段被初始化。
- 當在代碼中創建對象以將其放入DB中時,它接受「IUnityContainer」參數。
因此,在這兩種情況下,任何業務對象都有依賴容器,如果他需要獲取任何數據,他可以獲得適當的管理器實例並請求所需的數據。
問題描述:上週我看了一些問題/上,這樣的狀態是這樣的答案:
- 對象實例不應該訪問的依賴容器;
- 相反,他們應該在構造函數中接收所有必需的接口。
猜測,這同樣適用於管理器/存儲庫類:我不應該將容器實例傳遞給它們的構造函數,而應該將接口放到其他所需的組件中。
對我來說,這似乎是合理的,但:
我需要爲任何目的是提供他所需要的所有接口(通常,每個經理/庫/實體需要他們的3-5);
有很多情況下,只需要1-2接口(所以我不想創造很多其他);
問題1:真的是很好的辦法來 「隱藏」 的容器?爲什麼? (其實,我覺得我知道爲什麼,但如果你有好的答案,請告知)。
問題2:解決此類問題的最佳做法是什麼? (我使用Linq2Sql,並考慮切換到EF)我不能通過DependencyContainer創建對象,我自己應該這樣做(因爲對象是通過使用在SQL站點上執行的表達式創建,將使用分配給公共屬性的以下數據調用無參數構造函數;並且SQL方面不存在依賴項容器)。有沒有解決方法?
我實現的技術細節:
經理基類構造函數的例子:庫基類的
public abstract class ManagerBase : IManager
{
protected ManagerBase(IUnityContainer container)
{
DependancyContainer = container;
}
protected readonly IUnityContainer DependancyContainer;
...
}
例子:
public abstract class RepositoryBase<T, TDb> : IRepository<T>
where T : IEntity
where TDb : class, IDbEntity, new()
{
protected abstract ITable<TDb> GetTable();
public IQueryable<T> GetAll()
{
return GetTable().Select(GetConverter());
}
的數據是如何從數據庫中提取實例:存儲庫創建對象的實例並使用適當的DB數據初始化它們,其中「容器」字段已初始化:
public class CountryRepository
: RepositoryBase<ICountry, DbData.Country>, ICountryRepository
{
protected override Expression<Func<DbData.Country, ICountry>> GetConverter()
{
return dbEntity => new Country
{
DependancyContainer = DependancyContainer,
Code = dbEntity.CountryCode,
Name = dbEntity.CountryName,
};
}
以下是調用時需要的數據是從數據庫得到:
public class CountryManager : ManagerBase
{
ICountry GetCountryById(int countryId)
{
ICountryRepository repository = DependancyContainer.Resolve<ICountryRepository>();
return repository.GetAll()
.Where(country=>country.Id==countryId)
.SingleOrDefault()
;
}
}
我想回答你的問題,但不清楚'*有很多情況下只需要1-2個接口(所以我不想創建很多其他);「 ...創建很多其他特別的東西? – 2011-03-17 21:33:56
另外我認爲你的示例'CountryManager'應該擴展'ManagerBase'? – 2011-03-17 21:52:56
CountryManager是從managerBase繼承的,這是正確的 – Budda 2011-03-19 14:47:25