2011-02-01 93 views
3

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

当调用该方法时,日志文件整齐地记录每个通过接口实现的方法。在下面的示例代码中,方法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

回答

3

不,除非你的方法虚拟和使类代理获取生成公开该类作为一个(第一)服务是不可能的。然而,这味道像抽象的破碎。如果您将Foo曝光为IFoo,那么LogMeToo将永远不会被调用 - 无需记录任何内容。

+1

感谢您的回答。你能否指点我有关如何使方法变为虚拟并将类作为服务公开的文档?至于破碎的抽象:在我的真实代码中,Bar()在新的后台线程中启动LogMeToo(),并且当发生这种情况时我想拦截。 – KBoek 2011-02-02 09:51:54