1

警告: Ninjectの調査を始めたばかりです。

次のように定義された汎用DomainObjectクラスがあります。

public abstract class DomainObject<T> : IDomainObject where T : IDomainObject
{
    protected DomainObject(IDataProvider<T> dataProvider)
    {
        DataProvider = dataProvider;
    }

    // blah and blih

    protected IDataProvider<T> DataProvider { get; private set; }
}

上記のコードでわかるように、これにDomainObjectは、への依存関係を表すコンストラクターがありIDataProvider<T>ます。

私のNinjectモジュールでは、これがバインディングの方法です。metaDataは構成ストアから取得され、バインドする具体的なタイプを指定できます。

var medaData = DataContextDictionary.Items[type];
var genericDomainObjectType = typeof (DomainObject<>);
Type[] genericDomainObjectTypeArgs = { medaData.ObjectType };
var domainObjectType = genericDomainObjectType.MakeGenericType(genericDomainObjectTypeArgs);
Bind(domainObjectType).To(medaData.ObjectType);

var genericIDataProviderType = typeof (IDataProvider<>);
var iDataProviderType = genericIDataProviderType.MakeGenericType(genericDomainObjectTypeArgs);
Bind(iDataProviderType).To(medaData.DataProviderType);

これはうまく機能しますが、このコードは考案されており、より良い方法で記述できると思います。

Ninjectでそのような依存関係を表現するより良い方法はありますか?

ご協力いただきありがとうございます。

4

1 に答える 1

2

オープンジェネリックバージョンをバインドしますか、それともコードの「medaData」タイプに基づいて特定のクローズドタイプのみをバインドしますか?

オープンタイプをバインドすることが目的(または許容可能)である場合、少なくともNinject 3を使用すると、次のように「通常どおり」バインドできるはずです。

Bind(typeof(IDataProvider<>)).To(typeof(DataProvider<>));

特定の閉じた型のバインドに固執したい場合は、(規則拡張を使用できない限り)すでに持っているものよりも優れたメカニズムを知りません。

于 2012-07-27T07:55:31.500 に答える