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

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

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

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

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

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()&nbsp;Метод кажется, что 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>&nbsp;в конструкторе контроллера он выдает исключение

Код исключения 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&nbsp;конструктор. Есть ли какой-то способ, которым я могу сделать StructureMap способным играть с этим конструктором? Нужно ли переходить из конструктора и просто устанавливать свойство коллекции после создания экземпляра?

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

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

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

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

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

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

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>&nbsp;создать экземплярToCsvService&nbsp;но не знает, где его взять. Который идет кДжимми&nbsp;комментарий снизу об использовании StructureMap иКонструктор сеттер впрыска, Однако это кажется невозможным без добавления явной ссылки на сборку инфраструктуры.

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