Был поиск ответа на довольно простой вопрос (я предполагаю).Доступ к внешним классам из конфигурации Autofac
Просто начинайте с Autofac и DI в целом, поэтому у меня есть решение с 4 проектами. Console App выглядит следующим образом:
namespace ContainerPlugInPattern
{
class Program
{
static void Main(string[] args)
{
try
{
// Option1: Fill container with known objects
//var builder = new ContainerBuilder();
//// configuration - can be done programmatically or through configuration,
//// strongly typed with generics or more dynamically with Types,
//// can indicate whether created instances should be singleton or new instance per resolve
//builder.RegisterType<Adapter1>().As<IInstrumentAdapter>();
//builder.RegisterType<ExtraAdapter>().As<IInstrumentAdapter>();
//builder.RegisterType<MessageHandler>().As<IMessageHandler>();
//var container = builder.Build();
// Option2: fill container from configured components
//var builder = new ContainerBuilder();
//builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
//builder.RegisterType<MessageHandler>().As<IMessageHandler>();
//var container = builder.Build();
// Consumer code
var adapters = container.Resolve<IEnumerable<IInstrumentAdapter>>();
foreach (var adapter in adapters)
{
adapter.Configure("foo");
adapter.Connect();
}
}
catch (Exception ex)
{
Console.WriteLine("Exception:{0}", ex.Message);
}
Console.WriteLine("");
Console.WriteLine("Hit enter to exit");
Console.ReadLine();
}
}
}
Затем библиотеку (MyInterfaces.DLL и пространство имен = MyInterfaces), который имеет IInstrumentAdapter и IMessageHandler.
Тогда другая библиотека (DefaultAdapters.DLL и пространство имен = ContainerPlugInPattern.DefaultAdapters), который имеет класс, который реализует IInstrumentAdapter
И, наконец, третья библиотека (ExtraAdapter.DLL и пространство имен = ContainerPlugInPattern.ExtraAdapters), который имеет класс, также реализует IInstrumentAdapter.
Основное приложение имеет ссылки на все библиотеки, и если я выполняю код Option1 в верхней части блока try, я получаю консольную обратную связь, что все объекты были созданы и выполняются, как ожидалось. Проблема, которую я имею здесь, заключается в том, что основное приложение должно иметь эти ссылки для правильной работы (т. Е. Я не могу самостоятельно выпускать эти модули или расширять их с помощью дополнительных библиотек).
Что я действительно хочу, это загрузить эти компоненты с помощью конфигурации XML, и эти компоненты существуют в разных сборках и пространствах имен, предпочтительно, без необходимости ссылаться на них в главном приложении. Так что мой файл конфигурации выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<autofac defaultAssembly="ContainerPlugInPattern">
<components>
<component
type="DefaultAdapters.Adapter1, ContainerPlugInPattern.DefaultAdapters"
service="MyInterfaces.IInstrumentAdapter" />
<component
type="ExtraAdapter.ExtraAdapter, ContainerPlugInPattern.ExtraAdapter"
service="MyInterfaces.IInstrumentAdapter" />
</components>
</autofac>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
При попытке запуска приложения с файлом конфигурации я получаю следующее исключение:
Исключение: тип «DefaultAdapters.Adapter1, ContainerPlugInPattern.DefaultAdap Ослабляет» может не найдено. Это может потребовать квалификации сборки, например. «MyType, M yAssembly».
Хит войти, чтобы выйти
Очевидно, я не ссылающийся на сборку/пространство имен правильно и пытался несколько различных перестановок, чтобы получить вещи, чтобы начать, но безрезультатно. Документация была не очень полезной, так что я здесь.
Спасибо за любой ввод.
Спасибо! Это был тот толчок, в котором я нуждался, теперь конфигурация выглядит так, и все работает по назначению. –