10

私はIOCコンテナーを初めて使用し、NInjectを使い始めています。

コンストラクターにサービスではなく、IOCコンテナーによってインスタンス化する必要のないパラメーターを持たせたい場合は、どうしますか?

例えば:

public class Person
{
    private readonly string _name;
    private readonly IPersonRepository _repository;

    public Person(string name, IPersonRepository repository)
    {
        _name = name;
        _repository = repository;
    }

    ......
}

その名前がPersonクラスの要件であると想像してください。したがって、Personが常に名前を持つようにするには、その名前をコンストラクターに渡す必要があります。

NInjectを使用してPersonのインスタンスを取得するにはどうすればよいですか?名前は、アプリのどのビットが新しいPersonを作成するかによって渡される必要がありますが、IOCコンテナはIPersonRepositoryを渡す必要があります。

代わりにプロパティを使用して名前またはリポジトリのいずれかを挿入できることは理解していますが、これはクリーンなソリューションではありません。プログラミング言語のセマンティックパワーの一部が失われています。

4

3 に答える 3

8

この質問をしてから1年以上経ちましたが、今では当時よりも多くのことを知っています。Kevinの答えは正しく、ベストプラクティスですが、レガシークラスを操作する必要があり、私の質問にあるようなことをしたい場合があります。NInjectを使用してこれを行う方法は次のとおりです。

public class Person
{
    [Inject]
    public IPersonRepository PersonRepository { get; set; }

    private string _name;

    public Person(string name)
    {
         _name = name;
         StaticKernelContainer.Inject(this);
    }
}

StaticKernelContainerの実装は、NInjectWeb拡張プロジェクトにあります。

于 2011-04-19T05:09:07.973 に答える
5

上記のように、このクラスはIOCコンテナーで使用するのに適した候補ではありません。ここでは、ある状態(名前)を保持し、(リポジトリが使用されているものは何でも)何らかのアクションを実行するPersonエンティティと懸念事項を混ぜ合わせています。コンストラクターを介してIPersonRepositoryの実装を取得するクラスを介してPersonエンティティが取得または作成されるようにコードをリファクタリングすると、依存性注入の方が理にかなっている場所になります。

于 2009-11-06T05:23:08.180 に答える
2

私は上記のKevinMcMahonの応答に敬意を表して同意しません。その理由は、異なるIoCコンテナでのみ...あなたが望むことを正確に実行する依存性注入コードを見たからです。つまり、別のIocコンテナであるCastleWindsorでした。これにより、構成ファイルにセクションを作成して、名前に提供する値を指定できます(名前に指定することはあまり意味がありませんが、「connectionString」のようなプロパティの場合は、多くのことが必要になる可能性があります。検出)。

だから...あなたがやろうとしていることが一般的に依存性注入に適していないというわけではありません...それはNinjectがそれに慣れていないように見えるだけです(またはおそらくNinjectもそれに対応できます...私はしませんあまり使用されていない機能のすべてを十分に理解しているわけではありません)。

于 2009-11-08T04:28:27.550 に答える