System.NotSupportedException: у родителя нет конструктора по умолчанию. Конструктор по умолчанию должен быть явно определен - PullRequest
2 голосов
/ 05 июля 2010

Я работаю с Ninject 2.0.2
Ninject.Extensions.Interception
с DynamicProxy2
Castle.Core
Castle.DynamicProxy2

Впрыск работал нормально. Затем я вставил wcf между контроллером и бл слоями. Для взаимодействия между слоями я использовал Ninject.Extensions.Interception Яна Дэвиса. Я использовал DynamicProxy2 для создания прокси с помощью Castle.Core и Castle. Динамическая Proxy2. В моем слое Bl в классах есть ссылки на Типы реализации в слое DAL. Перехватчик работает, когда я отмечаю атрибут [Inject] на любое свойство существовало в слое BL. Это означает, что когда я обрезаю свои соединения от BL до DAL, это работает но это бесполезно. Таким образом, вопрос в том, как сохранить возможность обращения к DAL даже хотя я делаю это с помощью метода перехвата.

Я нашел только пост, который относится к теме - http://dotnet.dzone.com/news/ninject-2-dependency-injection?utm_sourc...) но это не объясняет, как с этим бороться. В каждом классе я уже создал конструктор, а также поместил Атрибут [Inject] над ним.

Примечание: Если я удаляю Inject из свойства IMyClassDao, я получаю Инъекция, но без собственности - она ​​остается мертвой. Как я могу оживить это? Я недавно обновился до Ninject 2.0.2 с 1.5 - может это связано версия вопроса? У кого-нибудь есть решение для этого?

Обработка ядра:

using Ninject; 
using Ninject.Modules; 
using System.Configuration; 
using System; 
using Ninject.Extensions.Interception; 
using Ninject.Extensions.Interception.Infrastructure.Language; 
using Ninject.Extensions.Interception.Request; 
private static IKernel createDefault() 
{ 
    IKernel _kernel = new StandardKernel(new 
    ControllerToBLModule(),new NHibernateModule(), new BlToDalModule()); 
    _kernel.Intercept(doIntercept).With<ControllerToBlInterceptor>(); 
    return _kernel; 
} 

в контроллере до бл:

public class ControllerToBLModule : NinjectModule 
{ 
    public override void Load() 
    { 
        Bind<IMyInterfaceBL>().To<MyClassBL>().InRequestScope(); 
    } 
} 

в бл / даль:

public class BlToDalModule : NinjectModule 
{ 
    public override void Load() 
    { 
           Bind<IMyClassDao>().To<MyClassDaoImpl>().InRequestScope(); 

    } 
} 

Так что код в моем Bl выглядит примерно так

public class MyClassBL: GlobalBL , IMyInterfaceBL 
{ 
    [Inject] 
    public MyClassBL() : base() { } 
    [Inject] 
    public IMyClassDao  _daoInstance{get;set;} 
    public virtual IList<MyObject> GetMyObject() 
    { 
        ... 
    } 
} 

и в DAL:

public class MyClassDaoImpl : GlobalDAOImpl, IMyClassDao 
{ 
    [Inject] 
    public MyClassDaoImpl() : base() { } 
    public virtual  IList<MyObject> GetMyObjectDao() 
    { 
        ... 
    } 
}

ошибка, которую я получаю:
Выполнить
System.NotSupportedException: у родителя нет конструктора по умолчанию. Конструктор по умолчанию должен быть явно определен.
в System.Reflection.Emit.TypeBuilder.DefineDefaultConstructorNoLock (метод выполняет атрибуты)
в System.Reflection.Emit.TypeBuilder.DefineDefaultConstructor (MethodAttribute s атрибуты)
в System.Reflection.Emit.TypeBuilder.CreateTypeNoLock ()
в System.Reflection.Emit.TypeBuilder.CreateType ()
at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType (Строитель типов введите) в e: \ horn.horn \ ioc \ castle.dynamicproxy \ Working-2.2 \ src ....

Кто-нибудь знает, как я могу сохранить иерархию адресации слоев через Ninject при использовании метода перехвата?

...