C# Castle Windsor-如何将实现泛型接口的接口注册到具有泛型的类?

C# Castle Windsor-如何将实现泛型接口的接口注册到具有泛型的类?,c#,generics,inversion-of-control,castle-windsor,decorator,C#,Generics,Inversion Of Control,Castle Windsor,Decorator,根据下面的代码,如何在Castle Windsor最新版本中设置注册,以使ISomeService解析为SomeDecorator public interface IService<in TRequest, out TResponse> { TResponse Get(TRequest request); } public class SomeRequest { public int SomeId { get; set; } public int Some

根据下面的代码,如何在Castle Windsor最新版本中设置注册,以使ISomeService解析为SomeDecorator

public interface IService<in TRequest, out TResponse>
{
    TResponse Get(TRequest request);
}

public class SomeRequest
{
    public int SomeId { get; set; }
    public int SomeOtherId { get; set; }
}

public class SomeResponse
{
    public int SomeId { get; set; }
    public string SomeName { get; set; }
    public IEnumerable<string> SomeList { get; set; }
}

public interface ISomeService : IService<SomeRequest, SomeResponse> { }

public class SomeService : ISomeService
{
    public SomeResponse Get(SomeRequest request)
    {
        return new SomeResponse { SomeId = request.SomeId, SomeName = "The Name", SomeList = new List<string>() };
    }
}

public class SomeDecorator<TRequest, TResponse> : IService<TRequest, TResponse>
{
    private readonly IService<TRequest, TResponse> _service;

    public SomeDecorator(IService<TRequest, TResponse> service)
    {
        _service = service;
    }

    public TResponse Get(TRequest request)
    {
        //Do something before
        var response = _service.Get(request);
        //Do something after
        return response;
    }
}
通过以下注册,ISomeService正在解析为SomeService,而不是SomeDecorator

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.Register(Component
        .For(IService<SomeRequest,SomeResponse>)
        .ImplementedBy(ISomeService));
    container.Register(Component
        .For(ISomeService)
        .ImplementedBy(SomeService));
    container.Register(Component
        .For(IService<,>)
        .ImplementedBy(SomeDecorator<,>)
        .IsDefault());
}
当我尝试注册SomeDecorator要实现的ISomeService时,我收到以下错误消息:

无法将类型为“SomeDecorator”“2[SomeRequest,SomeResponse]”的对象强制转换为类型为“ISomeService”


这里有一个让它工作的方法。此解决方案的缺点是,您必须针对要装饰的每个类注册装饰器

正如我在上面的评论中所说的,您可以通过取消ISomeService而使用公共类SomeService:iSeries来简化设计。然后,装饰师的注册如下所示:

container.Register(
    Component.For<IService<SomeRequest, SomeResponse>>()
        .ImplementedBy<SomeDecorator<SomeRequest, SomeResponse>>(),
    Component.For<IService<SomeRequest, SomeResponse>>()
        .ImplementedBy<SomeService>());

还请注意,您可以使用LINQ查询自动注册所有通用实现。

SomeDecorator没有实现接口服务,因此消息是正确的;也许您最好尝试并解决正确的接口?我有多个服务接口:ISomeService、IOtherService、iOnotherService,它们都使用特定的请求/响应对实现iSeries。我不能让某个decorator实现这些服务中的每一个,因为这将迫使我专门为每种类型实现Get函数。我想在Decorator中为实现的任何iSeries设备使用通用Get。我想我可能在尝试做一些不可能的事情。我想有更好的方法来做你想做的事情。尝试在运行时使用顶级工厂解析泛型类型。请查看我关于它们的问题,例如。@Lisa.Filemyr请参阅以获取一些有用的信息。此外,在我看来,您不需要ISomeService—您可以使用公共类SomeService:iSeries简化设计