2

我正在使用 Ninject 2.0.2
Ninject.Extensions.Interception

DynamicProxy2 Castle.Core
Castle.DynamicProxy2

注射效果很好。然后我在控制器和 bl 层之间插入了 wcf。对于层之间的交互,我使用了 Ian Davis 的 Ninject.Extensions.Interception。我使用 DynamicProxy2 在 Castle.Core 和 Castle.DynamicProxy2 的帮助下创建代理。在我的 Bl 层中,有对 DAL 层中实现类型的引用。当我在 BL layer 中存在的任何属性上标记 [Inject] 的属性时,拦截器正在工作。这意味着当我切断从 BL 到 DAL 的连接时,它可以工作,但没用。所以问题是如何保留寻址 DAL 的选项,即使我是通过拦截方法进行的。

我只找到了涉及该主题的帖子 - http://dotnet.dzone.com/news/ninject-2-dependency-injection?utm_sourc .. ) 但它没有解释如何处理它。在每个类中,我已经创建了一个构造函数,并在其上方放置了一个 [Inject] 属性。

注意:如果我从 IMyClassDao 的属性中删除 Inject ,我会得到 Injection 但没有该属性 - 它保持死态。我怎样才能恢复它?我最近从 1.5 升级到 Ninject 2.0.2 - 可以与版本相关吗?有没有人有解决方案?

内核处理:

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; 
} 

在控制器中到 bl:

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

在 bl 到 dal :

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() 
    { 
        ... 
    } 
}

我得到的错误:
Execute
System.NotSupportedException: Parent 没有默认构造函数。必须显式定义默认构造函数。
在 System.Reflection.Emit.TypeBuilder.DefineDefaultConstructorNoLock(MethodAtt ributes attributes)
at System.Reflection.Emit.TypeBuilder.DefineDefaultConstructor(MethodAttribute s attributes)
at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
at System.Reflection.Emit.TypeBuilder .CreateType()
at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(Type Builder type) in e:\horn.horn\ioc\castle.dynamicproxy\Working-2.2\src ....

有没有人知道在使用拦截方法期间如何保留通过 Ninject 寻址层的层次结构?

4

0 回答 0