私は Ninject 2.0.2
Ninject.Extensions.Interception
with DynamicProxy2
Castle.Core
Castle.DynamicProxy2で作業しています
注射はうまくいきました。次に、コントローラーと bl レイヤーの間に wcf を挿入しました。レイヤー間のやり取りには、Ian Davis の Ninject.Extensions.Interception を使用しました。私は、Castle.Core と Castle.DynamicProxy2 を利用してプロキシを作成するために DynamicProxy2 を使用しました。クラスの私のBlレイヤーには、DALレイヤーの実装タイプへの参照があります。BLレイヤーに存在するプロパティに[Inject]の属性をマークすると、インターセプターが機能します。つまり、BL から DAL への接続を切断すると機能しますが、役に立たないということです。したがって、問題は、インターセプト メソッドを使用している場合でも、DAL のアドレス指定のオプションを保持する方法です。
件名に言及している投稿のみを見つけました- http://dotnet.dzone.com/news/ninject-2-dependency-injection?utm_sourc .. .)しかし、それはそれに対処する方法を説明していません。すべてのクラスで、既にコンストラクターを作成し、その上に [Inject] 属性を配置しました。
注: IMyClassDao のプロパティから Inject を削除すると、インジェクションが取得されますが、プロパティがなくても、無効なままです。どうすれば復活できますか?最近、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: 親にはデフォルトのコンストラクターがありません。デフォルトのコンストラクターは明示的に定義する必要があります。
System.Reflection.Emit.TypeBuilder.DefineDefaultConstructorNoLock(MethodAtt ributes 属性)
で System.Reflection.Emit.TypeBuilder.DefineDefaultConstructor(MethodAttribute s 属性)
で System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
で 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 を介してレイヤーのアドレス指定の階層を保持する方法について、誰か考えを持っている人はいますか?