城堡温莎拦截器没有接口?

时间:2011-02-01 13:17:54

标签: c# c#-4.0 castle-windsor interceptor castle-dynamicproxy

使用Castle Windsor作为DI,我有两个实现相同接口的类;除此之外,还有一些自己的方法和属性。我正在使用Castle DynamicProxy并创建了一个Interceptor,它将通过Castle.Facilities.LoggingLoggingFacility对Log4Net进行一些日志记录。

当调用该方法时,日志文件会整齐地记录通过接口实现的每个方法。在下面的示例代码中,方法Foo()在被调用时被记录,但方法LogMeToo()没有,因为它不是IFoo实现的一部分。

我希望在调用时,其他方法不会实现接口记录。这是可能的,如果是这样的话:怎么样?

public interface IFoo
{
  void Bar();
}
[Interceptor(typeof(LoggingInterceptor))] public class Foo : IFoo { public void Bar() { // Do Something }
public void LogMeToo() { // Do Something } }
public static class Program { [STAThread] public static void Start() { var container = new WindsorContainer();
container.Register(Component.For<LoggingInterceptor>().LifeStyle.Transient); container.Register(Component.For<IFoo>().ImplementedBy<Foo>());
container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.Log4net).WithConfig("Log4net.config")); } }
WPF C#4.0

1 个答案:

答案 0 :(得分:3)

不,除非您将方法设为虚拟并将类作为(第一个)服务公开,以便生成类代理,否则不可能。然而,这闻起来像抽象的破碎。如果您将Foo公开为IFoo,那么LogMeToo永远不会被调用 - 无需记录任何内容。