2016-07-07 2 views
0

Я пытаюсь разрешить открытый общий тип, используя контейнер единства. Я получаю ResolutionFailed Exception. Я регистрируюсь программно. Невозможно понять, что происходит в методе InitContainer.PropertyInjection с открытым общим типом, используя исключение контейнера единственного единства

Обновление: новое свойство InjectionProperty («Возраст», 25)) в InitContainer, вызывающее исключение.

кода с использованием Unity 3,0

public abstract class Person<T> where T : class 
{ 
    protected T profession; 
    public Person(T profession) 
    { 
     this.profession = profession; 
    } 
    public abstract void WhoAreYou(); 
    public int Age { get; set; } 
} 

public class Employee<T> : Person<T> where T : class 
{ 
    string personType; 
    public Employee(T profession, string personType) : base(profession) 
    { 
     this.personType = personType; 
    } 

    public override void WhoAreYou() 
    { 
     Console.WriteLine("I am " + personType); 
     Console.WriteLine("My age is " + Age);   
     Console.WriteLine("Profession" + typeof(T).ToString());   
    } 
} 
public abstract class Profession { } 
public class Doctor : Profession { } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = InitContainer();   
     var p = container.Resolve<Person<Doctor>>(); 
     p.WhoAreYou(); 
     Console.ReadKey(); 
    } 
    static UnityContainer InitContainer() 
    { 
     UnityContainer container = new UnityContainer(); 
     container.RegisterType(typeof(Person<>), typeof(Employee<>), 
      new ContainerControlledLifetimeManager() , 
      new InjectionConstructor(new GenericParameter("T"), "Employee"), 
      new InjectionProperty("Age",25)); 
     return container; 
    } 
} 
+0

Хм ... в чем преимущество этого маршрута? Я просто вижу гору проблем, которые ждут, чтобы произойти, в этот момент ... – code4life

+0

Просто я тренирую контейнер, чтобы понять существующий код. – Vytheese

+0

Вы пытаетесь разрешить Employee , но конструктору нужен 'personType' – jlvaquero

ответ

1

Похоже, вы действительно нашли ошибку в единстве!

Эта проблема возникает только при попытке использовать комбинацию InjectionProperty в унаследованном имуществе с открытой регистрацией генериков. Этот должен поддерживать. Я смог воспроизвести эту проблему на Unity 3.0, 3.5 и 4.0 (последняя).

Любое из следующих исправлений вопрос ...

  • Удалить дженериков
  • Изменение в регистрации дженериков закрытые
  • Переместить свойство конкретного класса
  • Сделать свойство реферата или виртуальная базовый класс
  • Задайте объект по-другому, кроме использования InjectionProperty
Смежные вопросы