将截获的(Castle Windsor拦截器)接口转换为另一个接口

时间:2014-02-02 13:04:06

标签: casting castle-windsor interceptor castle-dynamicproxy

示例类

public interface IDog
{
    string Bark();
}

public interface ICat
{
    string Meow();
}

public class DogCat : IDog, ICat
{
    public string Bark()
    {
        return "Bark";
    }

    public string Meow()
    {
        return "Meow";
    }
}

在没有拦截器的世界里,如果我有实例,我可以轻松地施展它。

IDog dog = new DogCat();
ICat cat = (Cat)dog;

这是测试。如果我不使用LoggingInterceptor,我会引用DogCatcast会有效。 但是当我使用界面时,它无法投射。测试通过,即抛出InvalidCastException。我怎么能让它不抛出并施放它?我可以获得可用作ICat的代理吗?

[TestFixture]
public class LoggingInterceptorTests2
{
    private WindsorContainer _container;
    private Mock<ILogger> _mock;

    [SetUp]
    public void SetUp()
    {
        _container = new WindsorContainer();
        _mock = new Mock<ILogger>(MockBehavior.Loose);
        _container.Register(
            Component.For<LoggingInterceptor>().LifestyleTransient().DependsOn(new { HeavyLogging = true }),
            Component.For<IDog>().ImplementedBy<DogCat>().Named("dog").Interceptors<LoggingInterceptor>(),
            Component.For<ICat>().ImplementedBy<DogCat>().Named("cat").Interceptors<LoggingInterceptor>()
            );
    }

    [Test]
    public void CastInterceptorForATypeImplementing2Interfaces()
    {
        var dog = _container.Resolve<IDog>();
        dog.Bark().Should().Be("Bark");

        Action cat = () =>
        {
            var t = (ICat)dog;//I want it to be casted here
        };
        cat.ShouldThrow<InvalidCastException>();
    }
}

任务是我有一系列服务执行任务,在某些情况下可能是扩展服务。我打算进行扩展,如果演员阵容成功,我会扩展操作。一切都很好,但我需要用它作为Wcf&amp;使用拦截器。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

尝试改为:

Component.For<IDog,DogCat>().ImplementedBy<DogCat>().Named("dog").Interceptors<LoggingInterceptor>(),
Component.For<ICat,DogCat>().ImplementedBy<DogCat>().Named("cat").Interceptors<LoggingInterceptor>()

这会迫使windsor使用类代理。我同意上面的评论,你的设计似乎有缺陷。我已经用了一段时间了,所以让我知道如果它不起作用,那么我会查一查。

亲切的问候, Marwijn