Как использовать StructureMap с общими незамкнутыми типами, используя Scan с «жадным» конструктором

Между различными вопросами о переполнении стека и сообщениями в блогах имеется довольно много документации по теме открытых обобщений и StructureMap. К сожалению, я должен что-то упустить, так как мои попытки использованияscan выполнить конфигурацию вместе с реализацией класса, имеющей «жадный» конструктор, еще не получилось.

Я хочу, чтобы StructureMap захватил экземпляр нижеуказанного класса через ссылки на его реализованный интерфейс.ToCsvService существует в несвязанной сборке под названием Инфраструктура.IToCsvService существует в ссылочной сборке под названием Core. Как вы видетеToCsvService имеет "жадный" конструктор.

public class ToCsvService<TSource> : IToCsvService<TSource>
{
    public ToCsvService(ICollection<TSource> collection)
    {
    }
}

Я дал знать StructureMap оToCsvService черезConnectImplementationsToTypesClosing метод.

ObjectFactory.Initialize(cfg =>
{
    cfg.Scan(scan =>
    {
        scan.Assembly("Infrastructure");
        scan.WithDefaultConventions();

        // even with this call StructureMap cannot use ToCsvService
        // instance of IToCsvService (though wouldn't expect it to)
        scan.ConnectImplementationsToTypesClosing
            (typeof(IToCsvService<>));
    });
});

ОтObjectFactory.WhatDoIHave() Метод кажется, что StructureMap знает оToCsvService.

PluginType                            Name                                                                                                            Description                                                                                                                          
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1 (IToCsvService`1)                                                                                                                                                                                                                                      
Scoped as:  Transient                                                                                                                                                                                                                                                                                  
                                      6202a7ee-89a4-4edd-831d-4867b7dd1a7e                                                                            Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
                                      Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null                   

Однако когда я указываюIToCsvService<CustomerViewModel> в конструкторе контроллера он выдает исключение

Код исключения StructureMap: 202 Экземпляр по умолчанию не определен для PluginFamily Core.Services.IToCsvService`1 [[UI.Models.MachineForm, UI, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]], Core, Version = 1.0. 0.0, Культура = нейтральный, PublicKeyToken = ноль

Я предполагаю, что это потому, что StructureMap понятия не имеет, что передать "жадным"ToCsvService конструктор. Есть ли какой-то способ, которым я могу сделать StructureMap способным играть с этим конструктором? Нужно ли переходить из конструктора и просто устанавливать свойство коллекции после создания экземпляра?

ВопросСтруктура карты и общие типы детали я пытаюсь сделать, но не использую сканирование для этого.ответ предоставленоДжошуа Фланаган используетFor(x).Use(y) Конфигурация, которая может работать, если я не сканировал сборку, потому что у меня нет ссылкиToCsvService.

редактировать

Я хотел посмотреть, если использовать другой механизм, чтобы StructureMap идентифицировать экземплярыToCsvService<> будет иметь эффект. Это меняет то, что сообщается вObjectFactory.WhatDoIHave() и выбрасывает другое исключение. Вот пример использованияAddAllTypesOf.

ObjectFactory.Initialize(cfg =>
{
    cfg.Scan(scan =>
    {
        scan.Assembly("Infrastructure");
        scan.WithDefaultConventions();

        scan.AddAllTypesOf(typeof(IToCsvService<>));
    });
});

После использования вышеупомянутого дампа изObjectFactory.WhatDoIHave() является

PluginType                           Name                                                                                                                                 Description                                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1 (IToCsvService`1)    Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null                        Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null                   
Scoped as:  Transient

                                     Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null                        Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null                   
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1 (IToCsvService`1)    Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null                        Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null                   
Scoped as:  Transient

                                     Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null                        Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

С этой конфигурацией я выкидываю это исключение:

Код исключения StructureMap: 202 Экземпляр по умолчанию не определен для PluginFamily System.Collections.Generic.ICollection`1 [[UI.Models.MachineForm, UI, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]], mscorlib, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089

Для меня исключение указывает, что StructureMap знает, что ему нужноICollection<MachineForm> создать экземплярToCsvService но не знает, где его взять. Который идет кДжимми комментарий снизу об использовании StructureMap иКонструктор сеттер впрыска, Однако это кажется невозможным без добавления явной ссылки на сборку инфраструктуры.

Несколько связанные вопросы переполнения стека на StructureMap & GenericsСтруктура карты и универсальные типыИнъекция сеттера StructureMap в открытый универсальный тип?StructureMap Автоматическая регистрация универсальных типов с использованием ScanСообщения блогов, касающиеся StructureMap & GenericsAdvanced StructureMap: подключение реализаций для открытия универсальных типовAdvanced StructureMap: пользовательские соглашения о регистрации для частично закрытых типовОткройте универсальные типы в StructureMap

Ответы на вопрос(2)

Ваш ответ на вопрос