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