Замок Виндзорский перехватчик без интерфейса? - PullRequest
3 голосов
/ 01 февраля 2011

Используя Castle Windsor для DI, у меня есть два класса, которые реализуют один и тот же интерфейс;и кроме того, есть некоторые методы и свои собственные свойства.Я использую Castle DynamicProxy и создал Interceptor, который будет выполнять некоторую регистрацию с Log4Net через Castle.Facilities.LoggingLoggingFacility.

Файл журнала аккуратно регистрирует каждый метод, реализованный через интерфейс, когда этот методвызывается.В приведенном ниже примере кода метод Foo () регистрируется, когда вызывается, но метод LogMeToo () не регистрируется, поскольку он не является частью реализации IFoo.

Я хочу, чтобы и другие методы, которые не реализуют интерфейс, регистрируются при вызове.Возможно ли это, и если да, то как?

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

1 Ответ

3 голосов
/ 01 февраля 2011

Нет, это невозможно, пока вы не сделаете методы виртуальными и не представите класс как (первую) службу, чтобы сгенерировать прокси класса. Однако это пахнет как сломанная абстракция. Если вы выставляете Foo как IFoo, тогда LogMeToo никогда не вызовут - не нужно ничего регистрировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...