2011-04-20 16 views
5

temel sınıfında bir ilkel özellik enjekte Bu question ile ilgili, ancak bu soru StructureMap hakkındadır.StructureMap:

public interface ICommandHandler 
{ 
    ILogger Logger { get; set; } 
    bool SendAsync { get; set; } 
} 

Ben ICommandHandler uygulamak ve çözülmesi gereken birden çok uygulamaları vardır:

aşağıdaki arayüz tanımı var. Bu iki özelliği, ICommandHandler uygulayan örneklerde otomatik olarak enjekte etmek istiyorum.

public abstract class BaseCommandHandler : ICommandHandler 
{ 
    [SetterProperty] 
    public ILogger Logger { get; set; } 

    public bool SendAsync { get; set; } 
} 

Ancak bu, tüm ilkel bool tip enjekte bana yardımcı olmuyor:

tüm uygulamaları bir temel türünden devralan ve [SetterProperty] nitelik vererek ILogger enjekte yapmak için bir yol bulmuş uygulamalar.

İşte
public interface ICommandHandler<TCommand> : ICommandHandler 
    where TCommand : Command 
{ 
    void Handle(TCommand command); 
} 

benim şimdiki yapılandırma:

komut işleyicileri taban arabirimden kalıtımla genel arabirimi uygulamak

var container = new Container(); 

container.Configure(r => r 
    .For<ICommandHandler<CustomerMovedCommand>>() 
    .Use<CustomerMovedHandler>() 
    .SetProperty(handler => 
    { 
     handler.SendAsync = true; 
    })); 

container.Configure(r => r 
    .For<ICommandHandler<ProcessOrderCommand>>() 
    .Use<ProcessOrderHandler>() 
    .SetProperty(handler => 
    { 
     handler.SendAsync = true; 
    })); 

container.Configure(r => r 
    .For<ICommandHandler<CustomerLeftCommand>>() 
    .Use<CustomerLeftHandler>() 
    .SetProperty(handler => 
    { 
     handler.SendAsync = true; 
    })); 

// etc. etc. etc. 

Gördüğünüz gibi, ben her biri için özelliğini ayarlayın ve Oldukça hantal olan her konfigürasyon (ancak SetProperty'un Action<T> delegesini kabul etmesi oldukça hoştur).

StructureMap ile bunu daha verimli yapmak için hangi yollar vardır?

cevap

2

Belki bunu kullanabilirsiniz?

container.Configure(r => r.For<ICommandHandler>() 
    .OnCreationForAll(handler => 
    { 
     handler.Logger = container.Resolve<ILogger>(); 
     handler.SendAsync = true; 
    })); 
+0

Sizin için iki başparmak yukarıya! Çok teşekkür ederim. – Steven

İlgili konular