[英]How to write IOC and ServiceLocator agnostics C# class library?
我的應用程序處理多個客戶端,每個客戶端都有不同的設置。 因此,我決定使用IOC容器通過key
注冊每個客戶端特定的設置。 然后,我根據一個key
定位ClientSettings。 key
將在運行時可用。
C#庫MyCompany.BO
public class ClientSettings : IClientSettings
{
public string ClientApiKey { get; private set}
public string ClientId { get; private set}
public static IClientSettings Load(string clientname)
{
// Load the client specific information from JSON file using clientname
var cs = new ClientSettings();
cs.ClientApiKey = "Some client specific key";
cs.ClientId = "Some client specific key";
return cs;
}
}
在MyCompany.BO命名空間中使用
public class RuleEngine : IRuleEngine
{
IFactory _factory;
RuleEngine(IFactory factory)
{
factory = _factory;
}
public void Run(string request)
{
var clientname = ParseStringToGetClientName(request)
var clientSettings = ServiceLocator.Current.GetInstance<IClientSettings>(clientname);
var service = _factory.GetService(clientname);
service.DoWork(clientSettings);
}
}
主應用程序注冊客戶端設置
var container = new UnityContainer();
var clientASettings = ClientSettings.Load("ClientA");
var clientBASettings = ClientSettings.Load("ClientB");
var clientCSettings = ClientSettings.Load("ClientC");
// register singleton instance
container.RegisterInstance("ClientA", clientASettings);
container.RegisterInstance("ClientB", clientBSettings);
container.RegisterInstance("ClientC", clientCSettings);
題
RuleEngine類使用Microsoft.Practices.ServiceLocation.ServiceLocator
根據該key
定位ClientSettings
。 這意味着實現規則引擎的C#庫需要使用與應用程序相同的IOC。 (在這種情況下,哪個是Unity)
如何使圖書館不知道IOC容器?
在運行時知道key
值時,如何在不使用ServiceLocator的情況下在此處注入客戶端設置? 工廠模式是實現這一目標的唯一方法嗎? (例如,我查找服務_factory.GetService(clientname)
)
這三行:
var clientname = ParseStringToGetClientName(request);
var clientSettings = ServiceLocator.Current.GetInstance<IClientSettings>(clientname);
var service = _factory.GetService(clientname);
看起來像純凈的管道 ,幾乎沒有分支。 將該部分移至“ 合成根” 。 由於已將其放入“合成根目錄”中 ,因此沒有理由嘗試提取可能使用的任何DI容器 。 相反,您可以使用DI容器的API來簡單地組合所需的服務,並且可重用的類庫將不需要知道它是如何發生的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.