Ninject с WCF и перехватом (для АОП)

Я пытался заставить ninject работать в wcf, используя расширение wcf и перехват с расширением dynamicproxy2. Я в основном создал атрибут Time, и все это работает в базовом сценарии. У меня возникают проблемы, когда в модуле ninject я создаю привязку службы с аргументом конструктора:

Bind<IMyDependency>().To<MyDependency>();
Bind<IService1>().To<Service1>().WithConstructorArgument("dependency", Kernel.Get<IMyDependency>());

Все работает нормально, но атрибут Time не срабатывает ни для чего в моем Service1 или MyDependency.

Атрибут времени является стандартным, циркулирующим по всему Интернету. Единственным другим фрагментом кода на самом деле является метод CreateKernel — это global.asax, который выглядит следующим образом:

protected override IKernel CreateKernel() {
    IKernel kernel = new StandardKernel(
        new NinjectSettings() { LoadExtensions = false }, 
        new WcfNinjectModule(), 
        new DynamicProxy2Module()
    );
    return kernel;
}

Спасибо за любую помощь!

Мэтт

РЕДАКТИРОВАТЬ 12/12/2011: В соответствии с просьбой я добавил некоторые подробности ниже: Весь модуль wcf ninject:

public class WcfNinjectModule : NinjectModule
{

    public override void Load()
    {
        Bind<IMyDependency>().To<MyDependency>();
        Bind<IService1>().To<Service1>();
    }
}

Метод создания ядра в файле global.asax описан выше, а файл global.asax наследуется от NinjectWcfApplication.

Метод обслуживания выглядит следующим образом:

public class Service1 : IService1
{
    private IMyDependency _dependency;

    public Service1()
    {
    }
    public Service1(IMyDependency dependency)
    {
        _dependency = dependency;
    }

    [Time]
    public virtual string GetData(string value)
    {
        return string.Format(_dependency.GetMyString(), value);
    }
}
public interface IMyDependency
{
    string GetMyString();
}

public class MyDependency : IMyDependency
{
    [Time]
    public virtual string GetMyString()
    {
        return "Hello {0}";
    }
}

Это помогает?

После удаления аргумента WithConstructor атрибут перехвата времени будет срабатывать для GetMyString, но не для GetData.

Мэтт


person Matt Whetton    schedule 09.12.2011    source источник
comment
В чем причина использования .WithConstructorArgument("dependency", Kernel.Get<IMyDependency>());?. Ninject сам найдет зависимость. Если это не поможет, можете ли вы добавить полную проблему, а не только ее части.   -  person Remo Gloor    schedule 11.12.2011
comment
Я просто предпочитаю быть явным везде, где это возможно, но даже если я удалю его, у меня будет та же проблема. Я постараюсь добавить больше деталей выше, но сложно добавить все.   -  person Matt Whetton    schedule 12.12.2011


Ответы (1)


После небольшой дополнительной работы (и написания последнего редактирования поста) выясняется, что простое удаление метода WithConstructorArgument действительно решило мою проблему, и теперь все работает нормально.

Мэтт

person Matt Whetton    schedule 12.12.2011