2014-08-08 2 views
1

Был поиск ответа на довольно простой вопрос (я предполагаю).Доступ к внешним классам из конфигурации 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».

Хит войти, чтобы выйти

Очевидно, я не ссылающийся на сборку/пространство имен правильно и пытался несколько различных перестановок, чтобы получить вещи, чтобы начать, но безрезультатно. Документация была не очень полезной, так что я здесь.

Спасибо за любой ввод.

ответ

2

defaultAssembly должно быть названием сборки, из которой вы хотите зарегистрировать типы. Я вижу MyInterfaces, DefaultAdapter и ExtraAdapter, но у вас есть ContainerPlugInPattern. Поскольку вы регистрируете типы из двух разных сборок, выберите один из них.

Точка defaultAssembly состоит в том, чтобы сделать XML короче, если вы регистрируете тонну типов из одной сборки. Каждый компонент type значения должно быть простым в пространстве имен квалифицированного именем типа в сборке по умолчанию, или она должна быть полным сборочным квалифицированным имя типа (http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx и http://msdn.microsoft.com/en-us/library/yfsftwz6(v=vs.110).aspx).

Сборочный аттестат Namespace.Type, Assembly как ContainerPlugInPattern.DefaultAdapters.Adapter1, DefaultAdapters. Кажется, что у вас есть комбинация типов и пространств имен. Переключитесь на имена квалифицированных типов, и вы должны быть хорошими.(При переключении и он по-прежнему не работает, обновить свой вопрос с новым кодом, чтобы мы могли видеть, что вы пробовали.)

+0

Спасибо! Это был тот толчок, в котором я нуждался, теперь конфигурация выглядит так, и все работает по назначению. –

0

Это то, что конфигурация выглядит как

<autofac defaultAssembly="DefaultAdapters"> 
    <components> 
     <component 
     type="ContainerPlugInPattern.DefaultAdapters.Adapter1, DefaultAdapters" 
     service="MyInterfaces.IInstrumentAdapter, MyInterfaces" /> 
     <component 
     type="ContainerPlugInPattern.ExtraAdapters.ExtraAdapter, ExtraAdapter" 
     service="MyInterfaces.IInstrumentAdapter, MyInterfaces" /> 
    </components> 
</autofac> 
Смежные вопросы