2

DryIoc では、ファクトリ メソッドに文字列引数を渡すにはどうすればよいですか?

ウィキには、別の登録済みクラスを渡す方法の例がありますが、文字列を渡す方法がわかりません。

以下を考えると:

public interface MyInterface
{
}

public class MyImplementationA : MyInterface
{
    public MyImplementationA(string value) { }
}

public class Factory
{
    public MyInterface Create(string value)
    {
        return new MyImplementationA(value);
    }
}

public class MyService1
{
    public MyService1(MyInterface implementation) {  }
}

class Program
{
    static void Main(string[] args)
    {
        var c = new Container();
        c.Register<Factory>(Reuse.Singleton);
        c.Register<MyInterface>(Reuse.Singleton, made: Made.Of(r => ServiceInfo.Of<Factory>(),
            f => f.Create("some value") //How do I pass a string to the factory method?
        ));

        c.Register<MyService1>();

        var a = c.Resolve<MyService1>();
    }
}
4

1 に答える 1

2

特定の依存関係に文字列値を挿入する場合は、次のように実行できます。

c.Register<Factory>(Reuse.Singleton);
c.Register<MyInterface>(Reuse.Singleton, 
    made: Made.Of(r => ServiceInfo.Of<Factory>(),
           // Arg.Index(0) is a placeholder for value, like {0} in string.Format("{0}", "blah")
            f => f.Create(Arg.Index<string>(0)), 
            requestIgnored => "blah or something else"));

ここでは、 consumer タイプを log4net logger に提供する方法に関する wiki の同様の例を示します。

別の方法はc.RegisterInstance("value of blah", serviceKey: ConfigKeys.Blah);.

または、FactoryMethod 登録を使用して文字列プロバイダーを登録し、計算、遅延、またはその他の値を取得できます。分かりやすくするために属性付き登録の例:

[Export, AsFactory]
public class Config
{
    [Export("config.blah")]
    public string GetBlah()
    { 
      // retrieve value and
      return result;    
    }
}

// In composition root:
using DryIoc.MefAttributedModel;
// ...
var c = new Container().WithAttributedModel();
c.RegisterExports(typeof(Config), /* other exports */);
于 2016-01-08T19:58:50.287 に答える