一、构造注入 Constructors injection
构造注入适用于对象强依赖的情况,需要在构造函数中实例化别外一个类型,以控制对象的实例化顺序。已经存在的实例是不能使用构造注入,即不能使用构造注入改变实例属性。
以下情况适合使用构造注入
- 在实例化父对象时自动实例化子对象
- 想用一个简单的方法表示代码是类的依赖关系
- 父对象有能在太多的构造函数
- 父对象的构造函数不能有太多的参数
- 需要隐藏对象内部字段的值,而用属性或方法会使其显露
- 要控制父对象依赖的子对象,需要将依赖从代码中移出时
Unity建议当不确定使用哪种注入时,使用构造注入,除非是要在一个已有的对象实例改变属性时才使用其它注入。
DEMO:
namespace ConsoleUnityDemo.ConstractrInjection
{
public class Parent
{
private SubClass subClass;
public Parent(SubClass subInstance)
{
subClass = subInstance;
}
public string SubClassName
{
get {return subClass.ClassName;}
}
}
public class SubClass
{
public string ClassName{get;set;}
}
public class SubClassConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
return base.ConvertTo(context, culture, value, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
SubClass model = new SubClass();
model.ClassName = value.ToString();
return model;
}
return base.ConvertFrom(context, culture, value);
}
}
class Program
{
static void Main(string\[\] args)
{
UnityConfigurationSection unitySection = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
UnityContainer unityContainer = new UnityContainer();
unitySection.Configure(unityContainer, "ConstractInject"); //获取容器
ConstractrInjection.Parent parent = unityContainer.Resolve<ConstractrInjection.Parent>("ParentClass"); //取实例
Console.WriteLine(string.Format(parent.SubClassName));
}
}
}
Unity配置