2016-09-26 5 views
1

После настройки моей инъекции зависимости я получаю ошибки MEF с несоответствием мощности. Я считаю, что правильно экспортирую с интерфейсов, и когда я проверяю программу, фактический каталог пуст. Не уверен, что я делаю неправильно!Попытка сделать инъекцию зависимостей с MEF и получить ошибки

Контейнер Состав

private static CompositionContainer CreateContainer() 
    { 
     AggregateCatalog catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(IClient).Assembly)); 
     CompositionContainer container = new CompositionContainer(catalog); 
     return container;  
    } 

Создать контейнер

static void Main(string[] args) 
    { 
     CompositionContainer container = CreateContainer(); 
     IClient contactList = container.GetExportedValue<IClient>(); 

     // More code below, but error is happening on the above line 
    } 

Client Import

namespace MyWcfProgram.WcfProgram 
{ 
    [Export(typeof(IClient))] 
    public class Client : IClient 
    {  
     private readonly ILogic contactLogic; 

     [ImportingConstructor] 
     public Client([Import] ILogic contactLogic) 
     { 
      if(contactLogic == null) 
      { 
       throw new Exception(); 
      } else 
      { 
       this.contactLogic = contactLogic; 
      } 
     } 

     // MORE BELOW LEFT OUT 
    } 

Logic Import

namespace MyWcfProgram.Logic 
{ 
    [Export(typeof(ILogic))] 
    public class Logic : ILogic 
    { 
     private readonly IData dataAccess; 

     [ImportingConstructor] 
     public Logic([Import] IData dataAccess) 
     { 
      if (dataAccess == null) 
      { 
       throw new Exception(); 
      } 

      this.dataAccess = dataAccess; 
     } 

Data.cs

namespace MyWcfProgram.Data 
{ 
    [Export(typeof(IData))] 
    public class Data : IData 
    { 
     private string connectionString = "CONNECTION STRING IS HERE"; 
     private System.Data.SqlClient.SqlConnection myconnection = new System.Data.SqlClient.SqlConnection(); 

     // More code below, but no constructor since there are no dependencies 

} 
+0

ли 'ImportingConstructor' нужно иметь' Import' атрибут для параметра конструктора? – Fabio

+0

Да, обновлено, чтобы включить в себя также логику. DataAccess не импортирует никаких зависимостей. –

+0

Добавлены данные в любом случае на всякий случай, если есть проблема с ним. –

ответ

0

Я знаю, что ты не просил этого, но, возможно, я предлагаю использовать SimpleInjector вместо этого, если вы не имеете жесткую зависимость от MEF. MEF устарел, и если все, что вам нужно, - это структура IOC, в которой вы живете, вы будете бесконечно лучше использовать SimpleInjector.

Контейнер Состав

private static Container CreateContainer() 
    { 
     var container = new Container(); 

     container.Register<IClient, MyWcfProgram.WcfProgram.Client>(); 
     container.Register<ILogic, MyWcfProgram.Logic.Logic>(); 
     container.Register<IData, MyWcfProgram.Data.Data>(); 

     return container;  
    } 

Создать контейнер

static void Main(string[] args) 
    { 
     var container = CreateContainer(); 
     IClient contactList = container.GetExportedValue<IClient>(); 

     // More code below, but error is happening on the above line 
    } 

Client Import

namespace MyWcfProgram.WcfProgram 
{ 
    public class Client : IClient 
    {  
     private readonly ILogic contactLogic; 

     public Client(ILogic contactLogic) 
     { 
      if(contactLogic == null) 
      { 
       throw new Exception(); 
      } else 
      { 
       this.contactLogic = contactLogic; 
      } 
     } 

     // MORE BELOW LEFT OUT 
    } 

Logic Import

namespace MyWcfProgram.Logic 
{ 
    public class Logic : ILogic 
    { 
     private readonly IData dataAccess; 

     public Logic(IData dataAccess) 
     { 
      if (dataAccess == null) 
      { 
       throw new Exception(); 
      } 

      this.dataAccess = dataAccess; 
     } 

Data.cs

namespace MyWcfProgram.Data 
{ 
    public class Data : IData 
    { 
     private string connectionString = "CONNECTION STRING IS HERE"; 
     private System.Data.SqlClient.SqlConnection myconnection = new System.Data.SqlClient.SqlConnection(); 

     // More code below, but no constructor since there are no dependencies 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^