我有一個WCF服務它是託管在MVC應用程序。服務與幾個存儲庫(我有Code First設計)交互以完成它的工作。目前,我在每個Service方法中創建了所有Repository類的實例,我認爲這很糟糕,而且我的Service完全與Repository類耦合。我想知道我應該如何爲WCF服務實現一個漂亮而乾淨的DI。WCF服務可測試性和依賴注入
在此先感謝。
我有一個WCF服務它是託管在MVC應用程序。服務與幾個存儲庫(我有Code First設計)交互以完成它的工作。目前,我在每個Service方法中創建了所有Repository類的實例,我認爲這很糟糕,而且我的Service完全與Repository類耦合。我想知道我應該如何爲WCF服務實現一個漂亮而乾淨的DI。WCF服務可測試性和依賴注入
在此先感謝。
您可以採取的一種方法是在您的服務類中注入一個存儲庫工廠,然後從工廠調用/獲取您的存儲庫。
庫廠:
public interface IRepositoryFactory
{
IRepositoryOne GetRepositoryOne();
IRepositoryTwo GetRepositoryTwo();
}
public class RepositoryFactory: IRepositoryFactory
{
public DataAccess.RepositoryInterfaces.IRepositoryOne GetRepositoryOne()
{
return new RepositoryOne();
}
public DataAccess.RepositoryInterfaces.IRepositoryTwo GetRepositoryTwo()
{
return new RepositoryTwo();
}
}
服務類:
public ServiceClass: IService
{
private readonly IRepositoryFactory _repositoryFactory;
public ServiceClass(IRepositoryFactory factory)
{
_repositoryFactory = factory;
}
public IList<YourItems> GetYourItems()
{
var repository = _repositoryFactory.GetRepositoryOne();
return repository.GetItems(....);
}
}
通過這種方法,你需要註冊和解析只有你的倉庫工廠,而不是所有的個人資料庫。這是一種混合的方式,但我認爲它很乾淨,容易理解。當然,您可以在每次調用時始終不使用工廠並解決您的存儲庫問題。如果你願意的話,我也可以展示一個樣本。
謝謝爸爸,我也是這樣看的。 – saber
@SaberAmani ...你的歡迎 –
我建議使用依賴倒置原則:讓你的存儲庫實現一個特定的接口,然後讓你的服務類接受一個或多個接口的對象。不要直接引用具體的類。然後,你需要在你的服務類上做的所有事情就是調用一個接口公開的方法來提供你想要的任何/所有信息。
這樣做會將代碼彼此分離,因爲它們都依賴於抽象,並且仍然可以獲得您請求的精彩功能。
下面是你如何可能去做:假設你的WCF服務類需要RepositoryA,它實現IRepositoryA。你會做的是有一個IRepositoryA類型的字段(通常是private
)。然後在接收IRepositoryA類型的對象的服務中創建一個構造函數,然後設置該對象被傳入的字段變量。類似於this site上發現的內容:
有關依賴性反轉原理的更多信息,只需讀什麼叔叔鮑勃has to say。
+1感謝您的回覆,是的,我的存儲庫類擴展了自己的接口。問題是我不知道如何以及我應該在哪裏做你說的話? – saber
如果你自己找到了模板代碼,那麼如果當時沒有人有明天我可以發佈你的明天。正如我看到你的問題,它是:「我如何使用Unity實現一個wcf服務的DI」 –
@CasperLeonNielsen感謝任何幫助將是有用的。我明天會檢查你的回覆。 – saber