Я пытаюсь зарегистрировать несколько реализаций одного и того же интерфейса ... и затем ... использовать Setter для установки свойства в моем экземпляре приложения.Я пробовал несколько примеров в Интернете и всегда подключал один и тот же экземпляр к свойствам приложения 2.
- ПРИМЕЧАНИЕ. Я пробовал множество примеров в Интернете, ниже приведена только последняя версия
Например ... Когда я смотрю на объект приложения в Quick Watch, я получаю следующее
МОЯ КОНФИГУРАЦИЯ: Очевидно, я разобрал все остальные объекты ...
public ContainerRegistry()
{
Scan(
scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.LookForRegistries();
scan.AssembliesFromApplicationBaseDirectory(f => f.FullName.StartsWith("Demo.Common", true, null));
scan.AssembliesFromApplicationBaseDirectory(f => f.FullName.StartsWith("XXX.XXX.MeasurementContracts", true, null));
scan.AddAllTypesOf(typeof(IMeasurementContractsApplication));
scan.AddAllTypesOf(typeof(IInstanceProvider));
scan.SingleImplementationsOfInterface();
});
// --------
// NAMED INSTANCES - IInstanceProvider
For<IInstanceProvider>().Use<DistributionListProvider>();
For<IInstanceProvider>().Add<FirstDeliveryNoticeDocumentRecallManager>().Named("firstDeliveryNoticeDocumentRecallManager");
// --------
// APPLICATION
For<IMeasurementContractsApplication>().Use<MeasurementContractsApplication>()
// Component
.Setter(x => x.DistributionListProvider).Is<DistributionListProvider>()
.Setter(x => x.FirstDeliveryNoticeDocumentRecallManager).IsNamedInstance("firstDeliveryNoticeDocumentRecallManager");
}
ПРИЛОЖЕНИЕ Пример: Очевидно, я разобрал все другие объекты ...
public class MeasurementContractsApplication : IMeasurementContractsApplication
{
[SetterProperty]
public IMeasurementContractsUnitOfWork UnitOfWork { get; set; }
[SetterProperty]
public IInstanceProvider DistributionListProvider { get; set; }
[SetterProperty]
public IInstanceProvider FirstDeliveryNoticeDocumentRecallProvider { get; set; }
}
IInstanceProvider's:
public class DistributionListProvider : ProviderBase, IInstanceProvider
{
// Purposely left-out Properties, Methods etc.
}
public class FirstDeliveryNoticeDocumentAdminUpdateProvider : ProviderBase, IInstanceProvider
{
// Purposely left-out Properties, Methods etc.
}
public class ProviderBase
{
[SetterProperty]
public IMeasurementContractsUnitOfWork UnitOfWork { get; set; }
}
---------------------------------------- ОБНОВЛЕНИЯ: Из вопросов, заданных мне Для того, чтобы привести вещи к ЧРЕЗВЫЧАЙНОМУ ОСНОВНОМУ уровню ... Я решил реализовать МИНИМАЛЬНЫЙ набор из 2 классов, чтобы попробовать предложения:
public interface ITesting
{
string Name();
}
public class Foo : ITesting
{
public string Name()
{
return string.Empty;
}
}
public class Bar : ITesting
{
public string Name()
{
return string.Empty;
}
}
public ContainerRegistry()
{
Scan(
scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.LookForRegistries();
scan.AssembliesFromApplicationBaseDirectory(f => f.FullName.StartsWith("Demo.Common", true, null));
scan.AssembliesFromApplicationBaseDirectory(f => f.FullName.StartsWith("XXX.MeasurementContracts", true, null));
scan.AddAllTypesOf(typeof(IMeasurementContractsApplication));
scan.AddAllTypesOf(typeof(IManager<>));
scan.AddAllTypesOf(typeof(IDocumentDependency));
scan.AddAllTypesOf(typeof(IDataItemProviderFor<>));
scan.AddAllTypesOf(typeof(IDatasetBuilderFor<>));
scan.AddAllTypesOf(typeof(IXmlTransformerFor<>));
scan.AddAllTypesOf(typeof(IWorkflowProvider));
scan.AddAllTypesOf(typeof(IInstanceProvider));
scan.AddAllTypesOf(typeof(IPdfConverterClient));
scan.AddAllTypesOf(typeof(IReportFor<>));
scan.AddAllTypesOf(typeof(IAdminUpdateCommandFor<>));
scan.AddAllTypesOf(typeof(ITesting));
scan.SingleImplementationsOfInterface();
});
Component Providers
For<IMeasurementContractsApplication>().Use<MeasurementContractsApplication>()
Setter(x => x.Bar).Is<Bar>()
Setter(x => x.Foo).Is<Foo>();
}
Один из двух результатов всегда происходит
- Свойство равно NULL
- Я получаю следующее сообщение об ошибке
"Экземпляр по умолчанию не зарегистрирован и не может быть автоматически определен для типа 'IInstanceProvider' Нет значения по умолчаниюуказан экземпляр. "
В: Где находятся целевые реализации?
XXX.MeasurementContracts.Business Содержит «ContainerRegistry» и все классы, интерфейсы и т. Д.
XXX.MeasurementContracts.Web Содержит "StructuremapMvcConfig", инициализатор "IoC" и собственную "DefaultRegistry"
MeasurementContracts.UnitTests Добавляет Business «ContainerRegistry» в свой инициализатор «IoC» ..., а затем добавляет свою собственную «ContainerRegistry».
ATTEMPT: попытка именованных регистраций Я добавил следующее в «ContainerRegistry»", и в то же время ОБА заселены ... они типа" Бар "
// Component Providers
For<ITesting>().Use<Bar>().Named("Bar");
For<ITesting>().Add<Foo>().Named("Foo");
// Component Providers
For<IMeasurementContractsApplication>().Use<MeasurementContractsApplication>()
.Setter(x => x.Bar).Is<Bar>()
.Setter(x => x.Foo).Is<Foo>();
КАК РАЗРЕШИТЬ" Фу "?Я также пытался ".Setter (x => x.Foo) .Is (c => c.GetInstance (" Foo "));"
АНАЛИЗ: Использование container.WhatDoIHave () Хорошо, с помощью «WhatDoIHave» отображается, что я правильно настроил экземпляры «ITesting».
- Transient - XXX.MeasurementContracts.Business.Providers.Bar ('bar') - bar (по умолчанию)
- Переходный процесс - XXX.MeasurementContracts.Business.Providers.Foo ('foo') - foo
КАК РАЗРЕШИТЬ "Foo" & "Bar" на соответствующие свойства?