2016-01-07 5 views
1

В DryIoc, как передать строковый аргумент фабричному методу?Метод фабрики со строковым аргументом

В Wiki есть пример того, как передать другой зарегистрированный класс, но я не могу понять, как передать строку.

Учитывая следующее:

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>(); 
    } 
} 
+0

Как именно ваш код не работает? –

ответ

1

Если вы хотите, чтобы ввести значение строки для определенной зависимости вы можете сделать это следующим образом:

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")); 

Вот подобный пример из вики на how to provide Consumer type to log4net logger.

Другой способ: 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 */); 
Смежные вопросы