示例类
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
,我会引用DogCat
,cast
会有效。
但是当我使用界面时,它无法投射。测试通过,即抛出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;使用拦截器。我怎么能这样做?
答案 0 :(得分:1)
尝试改为:
Component.For<IDog,DogCat>().ImplementedBy<DogCat>().Named("dog").Interceptors<LoggingInterceptor>(),
Component.For<ICat,DogCat>().ImplementedBy<DogCat>().Named("cat").Interceptors<LoggingInterceptor>()
这会迫使windsor使用类代理。我同意上面的评论,你的设计似乎有缺陷。我已经用了一段时间了,所以让我知道如果它不起作用,那么我会查一查。
亲切的问候, Marwijn