しばらく依存性注入フレームワークとして使用してきた Ninject で動作するように傍受をセットアップしようとしています。
NuGet から傍受拡張機能をダウンロードし、Castle Dynamicproxy 実装と LinFu 実装の両方で試してみましたが、アプリケーションでは動作しませんでした。
パラメーターなしのコンストラクターを持たないクラスでプロキシを作成すると、Castle はエラーを発生させました。これは、すべてのサービス オブジェクトにコンストラクターを介して注入された依存関係があるためです。これは問題です。エラーは次のとおりです。
System.ArgumentException: クラスのプロキシをインスタンス化できません: emedia.RapidSystems.Subscriber.Presenters.RRSubmissionPresenter. パラメーターなしのコンストラクターが見つかりませんでした。パラメータ名: constructorArguments
LinFu インターセプターは、コードが汎用パラメーターを使用してメソッドを呼び出すまで、より適切に機能し、次のようになりました。
System.ArgumentException: ジェネリック型は無効です。パラメータ名: methodInfo
これは、傍受しようとしているクラスの 1 つの簡略化されたバージョン コードです。
[LogCalls]
public class Repository<T> : IRepository<T>
where T : class
{
public virtual T GetEntity<TKey>(ObjectContext context, TKey key)
{
var entity = GetEntity(context, key, _emptyLoadingStrategy);
return entity;
}
public virtual IQueryable<T> GetAll(ObjectContext context)
{
var query = GetAll(context, _emptyLoadingStrategy);
return query;
}
public virtual T Add(ObjectContext context, T entity)
{
context.AddObject(EntitySetName(context), entity);
return entity;
}
//other code goes here
}
Add と GetAll は正常に動作しますが、GetEntity がプロキシで呼び出されるとエラーが発生します。
この時点で、どちらのインターセプターもコード ベースで機能しないため、私は立ち往生しています。単純なデモクラスではなく、実際の複雑な実稼働システムで Ninject インターセプトを使用した人はいますか? もしそうなら、どのように? 機能する限り、どのインターセプターを使用してもかまいません。
それとも、Ninject による傍受はまだ十分に成熟していないのでしょうか。全体を Unity のような別のものに置き換えることを検討する必要がありますか?