0

我有一个服务接口 ICustomerService,并通过两种类型实现它:

public class CustomerService : ICustomerService
{
    // stuff
}

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

缓存的服务然后只是缓存并委托给普通服务。

对于注册,我将 ICustomerService 解析为 CachedCustomerService,然后 CustomerService 只是为其自己的类型注册。

这工作正常。

我想知道是否可以使 CachedCustomerService 需要一个接口而不是具体的 CustomerService。原因是我们最终可能会得到两种类型的 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 回答