使用Unity容器的开放泛型类型的PropertyInjection抛出异常

时间:2016-07-07 01:44:36

标签: c# generics unity-container

我正在尝试使用unity容器解析开放泛型类型。我收到了ResolutionFailed Exception。我正在以编程方式注册。无法理解InitContainer方法中出现的问题。

在InitContainer中更新:新的InjectionProperty(" Age",25))导致异常。

使用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;
    }
}

1 个答案:

答案 0 :(得分:1)

看起来你确实在Unity中发现了一个错误!

仅当您尝试将继承的属性上的InjectionProperty与开放的泛型注册结合使用时,才会出现此问题。此应该是受支持的方案。我能够在Unity 3.0,3.5和4.0(最新版本)上重现此问题。

以下任何一项解决了问题...

  • 删除泛型
  • 更改为已关闭的仿制药注册
  • 将属性移至具体类
  • 在基类上创建属性abstract或virtual
  • 使用InjectionProperty
  • 以外的其他方式设置属性