2012-04-04 15 views
0

Ich habe eine Service-Schnittstelle, ICustomerService, und von zwei Arten implementiert:Schloss Windsor - Registrierung und Resolving Cached und uncache Implementierung von derselben Schnittstelle

public class CustomerService : ICustomerService 
{ 
    // stuff 
} 

public class CachedCustomerService : ICustomerService 
{ 
    public CachedCustomerService(CustomerService service) { } 
} 

Der Cache-Dienst dann nur Caches und Delegierten die normalen Bedienung.

Zur Registrierung habe ich ICustomerService auf CachedCustomerService auflösen und dann CustomerService ist nur für seinen eigenen Typ registriert.

Das funktioniert gut.

Ich frage mich, ob ich CachedCustomerService eine Schnittstelle anstelle des konkreten CustomerService benötigen kann. Der Grund dafür ist, dass wir möglicherweise zwei Arten von CustomerService haben, und ich möchte (wenn möglich) eine zwischengespeicherte Version vermeiden, die für jede einzelne Version spezifisch ist.

So der Konstruktor von CachedCustomerService würde ändern:

public class CachedCustomerService : ICustomerService 
{ 
    // notice the ICustomerService 
    public CachedCustomerService(ICustomerService service) { } 
} 

ich die totale Kontrolle über die Registrierung, aber die Auflösung wird durch die Schalen von asp.net Mvc getan.

Danke!

Antwort

3

Alles, was Sie mit Castle Windsor zu tun haben, ist wie this article schlägt vor. Also in Ihrem Fall müssen Sie einfach Ihren Kundendienst, um mit im Cache befindlichen Dienst zuerst registrieren:

kann
var container = new WindsorContainer() 
.Register(
Component.For(typeof(ICustomerService)).ImplementedBy(typeof(CachedCustomerService)), 
Component.For(typeof(ICustomerService)).ImplementedBy(typeof(CustomerService)) 
); 

Dann Cached Kundenservice ICustomerService als Innen-/gewickeltes Objekt verwenden, wie folgt:

public class CachedCustomerService : ICustomerService 
{ 
    private ICustomerService _customerService; 
    public CachedCustomerService(ICustomerService service) 
    { 
     Console.WriteLine("Cached Customer service created"); 
     this._customerService = service; 
    } 

    public void Run() 
    { 
     Console.WriteLine("Cached Customer service running"); 
     this._customerService.Run(); 
    } 
} 

Und dann ist die Auflösung so normal:

ICustomerService service = container.Resolve<ICustomerService>(); 
service.Run();