0

サービス インターフェイス ICustomerService があり、次の 2 つのタイプで実装されています。

public class CustomerService : ICustomerService
{
    // stuff
}

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

キャッシュされたサービスは、キャッシュして通常のサービスに委譲します。

登録のために、 ICustomerService を CachedCustomerService に解決し、 CustomerService を独自のタイプに登録します。

これはうまくいきます。

私が疑問に思っているのは、具体的な CustomerService の代わりに CachedCustomerService にインターフェースを要求させることができるかどうかです。その理由は、最終的に 2 種類の CustomerService になる可能性があり、それぞれに固有のキャッシュ バージョンを (可能であれば) 避けたいからです。

したがって、CachedCustomerService のコンストラクターは次のように変更されます。

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

私は登録を完全に制御できますが、解決はasp.net mvcのボウルによって行われます。

ありがとう!

4

1 に答える 1

3

キャッスル ウィンザーと関係があるのは、この記事が示唆するとおりです。したがって、あなたのケースでは、最初にキャッシュされたサービスに順番に顧客サービスを登録する必要があります。

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();
于 2012-04-05T06:27:20.107 に答える