2015-10-16 4 views
0

Я использую Unity как IoC. Я хочу зарегистрировать несколько классов в контейнере с RegisterTypes следующим образом:Unity RegisterTypes не работает должным образом

container.RegisterTypes(
           AllClasses.FromAssembliesInBasePath(), 
           WithMappings.FromAllInterfaces, 
           WithName.TypeName, 
           WithLifetime.PerResolve 
           ); 

Но типы arn't класс instanced.My Интерфейс:

namespace Taschenrechner 
{ 
public interface IBerechne 
{ 
    int Berechnen(Formel formel); 
} 
} 

И мои классы:

class Addition : IRechenoperation 
{ 
    public char Operator 
    { 
     get 
     { 
      return '+'; 
     } 
    } 

    public int Berechnen(int operand1, int operand2) 
    { 
     return operand1 + operand2; 
    } 
} 

class Subtraktion : IRechenoperation 
{ 
    public char Operator 
    { 
     get 
     { 
      return '-'; 
     } 
    } 

    public int Berechnen(int operand1, int operand2) 
    { 
     return operand1 - operand2; 
    } 
} 

И конструктор, в котором я хотел бы использовать эти типы, является следующим:

public Parser(Formel formel,IRechenoperation[] rechenoperationen) 
    { 
     this.ergebnisformel = formel; 
     this.rechenoperationen = rechenoperationen; 
    } 

Когда я выполняю код rechenoperationen, это всегда пустой массив.

+1

Если я чего-то не хватает, вы показываете интерфейс ('IBerechne'), который ваши классы не реализуют (они реализуют« IRechenoperation »). Чтобы быть уверенным, что ваши классы «Добавление» и «Субтракция» находятся в «AllClasses.FromAssembliesInBasePath()»? – Jcl

+0

Я сделал ошибку в примере должен быть этот интерфейс: публичный интерфейс IRechenoperation { int Berechnen (int operand1, int operand2); char Оператор {get; } } –

+0

Опять же, вы проверили «Дополнение» и «Subtraktion» в возвращаемом перечислении из «AllClasses.FromAssembliesInBasePath()»? – Jcl

ответ

1

Проблема в том, что AllClasses.FromAssembliesInBasePath() не находит ваши Addition и Subtraktion типов, потому что они internal.

Самый очевидный способ заставить их найти их, будет делать их public.

Вы могли бы на самом деле заставить его работать с internal, но это не рекомендуется (разрешение внутренних или частных зависимостей просто не рекомендуется практика) и будет «Hacky», мягко говоря, (с помощью InternalsVisibleTo, если вы хотите, чтобы Google его). Если это абсолютное обязательство, я мог бы расширить это, но вам нужно будет предоставить более подробную информацию о том, как ваши проекты структурированы в решении.

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