1

У меня есть проблема .... Чтобы не сказать, у меня есть класс, как этот:StructureMap типа решительность с параметрами

public class A: InterfaceA 
{ 
    private FileInfo _fileInfo = null; 
    public A(FileInfo fileInfo) 
    { 
     this._fileInfo = fileInfo; 
    } 

    ... 
} 

и еще один:

public class B: InterfaceB 
{ 
    private A _classA = null; 
    public B(A classA) 
    { 
     this._classA = classA; 
    } 

    public void Do() 
    { 
     FileInfo fi = new FileInfo(...); 
     _classA.DoSomething(); 
    } 
} 

Теперь у меня есть настройки StructureMap регистрируется следующим образом:

For<InterfaceA>().Use<A>(); 
For<InterfaceB>().Use<B>(); 

и когда я выполняю структуру структуры B.Do(), выдается ошибка, потому что нет записи реестра для параметра FileInfo. Параметр класса A (FileInfo) построен в классе B; Я знаю, что могу сделать: ObjectFactor.GetInstance() и передать параметры, но я хочу, чтобы Инъекция инъекции не была поставщиком услуг. И я хочу, чтобы, когда я делаю ObjectFactory.GetInstance(), для построения всего графа объектов.

Как это сделать?

ответ

4

Вы можете использовать инструкцию Ctor, чтобы сообщить SM, какие объекты использовать для параметров Ctor.

var myFile = new FileInfo(...); 
For<InterfaceA>.Use<A>().Ctor<FileInfo>().Is(myFile); 

Подробнее о Ctor аргументы here.

Edit: В случае, если имя файла не известно до выполнения метода Do в B, вы должны отложить создание A-объект, пока метод делать не выполняются. Для этого вы можете использовать фабрику либо вручную, либо Func/Lazy.

Для подхода Func вы можете изменить B взять Func из А, как CTOR зависимость:

public class B : InterfaceB 
{ 
    private readonly Func<string, InterfaceA> _aBuilder; 
    public B(Func<string, InterfaceA> aBuilder) 
    { 
    _aBuilder = aBuilder; 
    } 

    public void Do() 
    { 
    InterfaceA anA = _aBuilder("fileName"); 
    anA.DoSomething(); 
    } 
} 

загрузочный его с помощью:

ObjectFactory.Initialize(
    c=> 
    { 
    c.For<InterfaceA>().Use<A>(); 
    c.For<Func<string, InterfaceA>>().Use(d => 
     new Func<string, InterfaceA>(s => 
     ObjectFactory.With(new FileInfo(s)).GetInstance<InterfaceA>())); 
    c.For<InterfaceB>().Use<B>(); 
    } 
); 
+0

В случае, если имя файла неизвестно до выполнения метода Do, вам нужно либо пойти на заводский подход, либо рассмотреть возможность передачи файла методу. – PHeiberg

+0

Отредактировал мой ответ, чтобы включить фабричный подход. – PHeiberg

Смежные вопросы