我正在使用 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 寻址层的层次结构?