1

私の要件は、ここで尋ねられた質問と非常によく似ています - With.Parameters.ConstructorArgument with ninject 2.0 これはばかげた質問かもしれません-しかし、呼び出し中にコンストラクターにパラメーターを送信するアプローチはGet<IMyType>、の哲学に反しますデカップリング(DIの主な動機はこれだと思います)自体?これは、 のユーザーが の特定の実装のコンストラクターを知っている
ことを前提としています。 インターフェイス内でコンストラクターの引数を宣言する方法がないため、コンストラクターで異なるパラメーターのセットを取り、その実装にバインドする別の実装を将来追加できる可能性があります。繰り返しになりますが、デカップリングの哲学に従って、コードはIMyTypeIMyType
Bind<IMyType>.To<ADifferentImpl>()から実装オブジェクトを取得する、以前に作成された任意のモジュールで動作できるはずですGet<IMyType>

私は非常によく似た要件を持っています-バインディング時にコンストラクターパラメーターの値がわからないが、アクセス時のみです。与えられた状況で従うべき最善のアプローチは、Adrian Grigore の答えに従うことだと思いました。他のアプローチがあれば教えてください。

4

1 に答える 1

0

私がそれをどのように行ったかの例を作ります:

public static class DI
{
    private static IKernel _kernel;
    private static Boolean _kernelLoaded = false;
    public static T Resolve<T>() where T : class
    {
        ...
        var a = _kernel.Get<T>();
        return a;
    }
   ...
}

これは、パラメーターを持つコンストラクターを持つUserRepositoryクラスです。

public class UserRepository : RepositoryBase<User>, IUserRepository
{
    public UserRepository(IMyContext context)
        : base(context)
    {
    }

    public void AddList(String name)
    {

    }
}

私のコンストラクターはのインターフェースでのみ機能することがわかるようにMyContext、Ninjectは、それがninjectに登録されている場合、IMyContext例のデフォルトコンストラクターに自動的に与えます。

ninjectのバインディングの例を次に示します。

    public override void Load()
    {
        Bind(typeof(IUserRepository)).To(typef(UserRepository));
        Bind(typeof(IMyContext)).To(typeof(MyContext));
        ...
    }

したがって、次のようにコードでこのリポジトリを取得できます。

        var repository = DI.Resolve<IUserRepository>();
        List<User> users = repository.GetAll();

そしてそれも機能しています

于 2013-03-01T04:42:00.593 に答える