簡體   English   中英

如何編寫IOC和ServiceLocator不可知的C#類庫?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM