2012-04-04 2 views
0

:通常の状態に城ウィンザーは - 私は、サービス・インターフェース、ICustomerServiceを持っており、それは二つのタイプによって実装されている登録と解決キャッシュと同じインタフェースの非キャッシュ実装

public class CustomerService : ICustomerService 
{ 
    // stuff 
} 

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

キャッシュされたサービスそしてちょうどキャッシュおよび代表者サービス。

登録のために、私はICustomerServiceをCachedCustomerServiceに解決し、それからCustomerServiceはそれ自身のタイプのために登録されています。

これは問題なく動作します。

CachedCustomerServiceに具体的なCustomerServiceの代わりにインターフェイスが必要な場合は、私が疑問に思っていることがあります。その理由は、2つのタイプのCustomerServiceで終了する可能性があり、可能であれば、それぞれに固有のキャッシュバージョンを避けたいからです。

のでCachedCustomerServiceのコンストラクタは、に変更します:私は登録を完全にコントロールを持っていますが、解像度はasp.netのMVCのボウルで行われ

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

ありがとうございます!

答えて

3

キャッスルウィンザーとの関係は、this articleのようなものです。 だからあなたの場合にはあなたは、単に最初にキャッシュされたサービスで順番にあなたの顧客サービスを登録する必要があります。

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

次のようにキャッシュされた顧客サービスは、内側/ラップされたオブジェクトとしてICustomerServiceを使用することができます。

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(); 
    } 
} 

をそして、解像度は通常通りです:

ICustomerService service = container.Resolve<ICustomerService>(); 
service.Run(); 
関連する問題