2011-02-01 2 views
3

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

Файл журнала аккуратно регистрирует для каждого метода, который реализован через интерфейс, когда этот метод вызывается. В примере кода ниже метод 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