工厂模式与Unity Buildup <t>麻烦

时间:2017-05-04 14:14:24

标签: c# unity-container inject

我的演示代码非常简单

using Microsoft.Practices.Unity;
using System;

public interface IDecorator
{
    string GetA();
}

public class Decorations:IDecorator
{

    public string GetA()
    {
        return "temp";
    }
}

public class Base
{

}

public class Derive : Base
{
    [Dependency]
    public IDecorator DerivedDecorations { get; set; }
}


public class Program
{
    private static void Main(string[] args)
    {

        Base bd = new Derive(); // here is the point

        var container = new UnityContainer();
        container.RegisterType<IDecorator, Decorations>();

        container.BuildUp(bd); // bd.DerivedDecorations is null

        Console.WriteLine("Press any key to continue...");
        Console.ReadKey();
    }
}

在上述情况下无法解析Derive类中的DerivedDecorations

如果我们将代码更改为Derive bd = new Derive();则没有问题

我不清楚原因,因为我们正在使用工厂模式,任何人都可以给我一些理由吗?

1 个答案:

答案 0 :(得分:2)

查看通用BuildUp-Method重载。

Unity使用指定的Type of T来检查它的属性并确定要注入的依赖项。

在您的情况下,您没有明确指定T,而是依赖于type inference,它解析为“Base”类(因为参数变量类型的类型为“Base”)。

因此要么相应地声明你的变量,要么通过non-generic version尝试另一种方法:

container.BuildUp(typeof(Derived), bd);

container.BuildUp(bd.GetType(), bd); //which resolves to "Derived"

在给定的示例中,目前没什么意义,但我希望您的示例可以简化。