3

Web API プロジェクトで一般的な依存関係の解決に StructureMap (バージョン 3.1.4.143) を使用していますが、これまでのところ問題なく動作しています。structuremap が、ほとんどのパラメーターを持つコンストラクターを選択するというデフォルトの動作に従うことを望みます。ただし、特定の型については、特定のコンストラクターを使用する必要があります。

例: サービス契約を結んでいます

public interface IService 
{
    void DoSomething();
}

そして実装のような

public class Service : IService 
{
    public Service() { //something }
    public Service(IRepo repo, ILogger logger) { //something }
    //rest of the logic
}

このタイプのみ、パラメーターなしのコンストラクターを使用したいと考えています。StructureMap 3 でそれを行うにはどうすればよいですか? (IConstructorSelector のインスタンスを作成し、それを以下のようにポリシーとして適用することで、すべての型にそれを行うことができます)

x.Policies.ConstructorSelector<ParamLessConstructorSelector>();
4

2 に答える 2

4

私自身の質問に答える:

これは、StructureMap 3 でこれを行う正しい方法です。SelectConstructor を使用すると、structuremap は指定された式からコンストラクターを推測します。

x.ForConcreteType<Service>().Configure.SelectConstructor(() => new Service());

または、For-Use-mapping で指定することもできます。

x.For<IService>().Use<Service>().SelectConstructor(() => new Service());

Github StructureMap docsのドキュメントを確認してください。

このルールをアプリケーション全体に適用する必要がある場合は、IConstructorSelector のインスタンスを作成することで、ルールをポリシーとして適用できます。

public class ParamLessConstructorSelector : IConstructorSelector
{
    public ConstructorInfo Find(Type pluggedType)
    {
        return pluggedType.GetConstructors().First(x => x.GetParameters().Count() == 0);
    }
}

そしてコンテナを構成します。

x.Policies.ConstructorSelector<ParamLessConstructorSelector>();
于 2014-10-15T20:02:59.710 に答える
0

特定の型に使用するコンストラクターを指定できます。次の行に沿ったどこか:

x.SelectConstructor<Service>(() => new Service());

詳細については、ドキュメントを参照してください。

編集:

StructureMap3 の場合は次のようになります。

x.Policies.ConstructorSelector(...)
于 2014-10-15T09:51:11.700 に答える