Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有接口的温莎城堡拦截器?_C#_C# 4.0_Castle Windsor_Interceptor_Castle Dynamicproxy - Fatal编程技术网

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

C# 没有接口的温莎城堡拦截器?,c#,c#-4.0,castle-windsor,interceptor,castle-dynamicproxy,C#,C# 4.0,Castle Windsor,Interceptor,Castle Dynamicproxy,使用Castle Windsor for DI,我有两个类实现了相同的接口;除此之外,它们还有自己的一些方法和特性。我正在使用Castle DynamicProxy并创建了一个拦截器,该拦截器将通过Castle.Facilities.LoggingFacility与Log4Net进行一些日志记录 当调用该方法时,日志文件会整齐地记录通过接口实现的每个方法。在下面的示例代码中,调用方法Foo()时会记录日志,但方法LogMeToo()不会记录日志,因为它不是IFoo实现的一部分 我还希望在调用时记

使用Castle Windsor for DI,我有两个类实现了相同的接口;除此之外,它们还有自己的一些方法和特性。我正在使用Castle DynamicProxy并创建了一个拦截器,该拦截器将通过Castle.Facilities.LoggingFacility与Log4Net进行一些日志记录

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

我还希望在调用时记录未实现接口的其他方法。这有可能吗?如果有,怎么可能

公共接口IFoo
{
空心钢筋();
}
[拦截器(类型(记录拦截器))] 公共类Foo:IFoo { 公共空白栏() { //做点什么 }
公共休息室() { //做点什么 } }
公共静态类程序 { [状态线程] 公共静态void Start() { var container=new WindsorContainer();
容器.寄存器(组件.For
().lifety.Transient);
container.Register(Component.For
()。由
()实现);
container.AddFacility
(f=>f.LogUsing(LoggerImplementation.Log4net).WithConfig(“Log4net.config”);
}

}
WPF C#4.0

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

谢谢你的回答。您能给我指一下关于如何使方法虚拟化并将类作为服务公开的文档吗?至于中断的抽象:在我的真实代码中,Bar()在一个新的后台线程中触发LogMeToo(),我希望在发生这种情况时进行拦截。
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")); } }