我的演示代码非常简单
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();
则没有问题
我不清楚原因,因为我们正在使用工厂模式,任何人都可以给我一些理由吗?
答案 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"
在给定的示例中,目前没什么意义,但我希望您的示例可以简化。