2015-12-15 22 views
2

,使用構造器注入註冊一些配置值,我這樣做:簡單的注射器 - 如何通常註冊手動創建的裝飾實例

string setting = ConfigurationManager.AppSettings["SomeSetting"]; 
container.Register<IService>(new Service(setting)); 

你怎麼做到類似的事情,爲了傳遞一個配置值到一個裝飾器構造函數?

是否可以創建一些可以注入裝飾器的配置提供程序類的唯一方法?看起來像RegisterDecorator應該有一個超載,允許根據需要手動新建類。

回答

4

有幾種方法可以實現這一點。如果對象圖的那部分很簡單,手工打造的對象圖可能會提供最好的結果:

container.RegisterSingleton<IService>(new ServiceDecorator(
    setting, 
    new RealService())); 

// or 
container.Register<IService>(() => new ServiceDecorator(
    setting, 
    new RealService())); 

中有簡單的噴油器RegisterDecorator沒有委託過載,這意味着你不能註冊一個裝飾使用RegisterDecorator這是手動,但有一些替代方法。

您可以將設置值提取到它自己的類中。這使得該抽象得到注入到裝飾:

container.RegisterSingleton<MySetting>(new MySetting(setting)); 
container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator)); 

public ServiceDecorator : IService { 
    public ServiceDecorator(MySetting setting, IService decoratee) { } 
} 

或者,你可以注入設置到裝飾的屬性:

container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator)); 
container.RegisterInitializer<ServiceDecorator>(dec => dec.Setting = setting); 

public ServiceDecorator : IService { 
    public string Setting { get; set; } 
    public ServiceDecorator(IService decoratee) { } 
} 

或者你可以讓Setting靜態屬性:

ServiceDecorator.Setting = setting; 
container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator)); 

如果裝飾本身不能改變,你可以從該類得到:

public ServiceDecoratorWithSetting : ServiceDecorator { 
    public static string Setting { get; set; } 
    public ServiceDecorator(IService decoratee) : base(Setting, decoratee) { } 
} 

ServiceDecoratorWithSetting.Setting = setting; 
container.RegisterDecorator(typeof(IService), typeof(ServiceDecoratorWithSetting)); 

最後一個選項是override parameter injection behavior,但這有點複雜,我通常只會在集成方案中提出建議。

相關問題