Unity IOC容器的构造函数使用笔记(不能错过的Unity示例)
示例一,正常使用:
相关定义:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface ICar { int Run(); } public class BMW : ICar { private int _miles = 0; public int Run() { return ++_miles; } } public class Ford : ICar { private int _miles = 0; public int Run() { return ++_miles; } } public class Audi : ICar { private int _miles = 0; public int Run() { return ++_miles; } } public class Driver { private ICar _car = null; public Driver(ICar car) { _car = car; } public void RunCar() { Console.WriteLine("Running {0} - {1} mile ", _car.GetType().Name, _car.Run()); } }
使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var container = new UnityContainer(); container.RegisterType<ICar, BMW>(); var driver = container.Resolve<Driver>(); driver.RunCar();
我们使用Resolve来解析我们想要的调用对象,在这里是Driver。
示例二,多个注入:
相关定义的代码不变,将使用部分的代码改为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var container = new UnityContainer(); container.RegisterType<ICar, BMW>(); container.RegisterType<ICar, Audi>("LuxuryCar"); // Register Driver type container.RegisterType<Driver>("LuxuryCarDriver", new InjectionConstructor(container.Resolve<ICar>("LuxuryCar"))); Driver driver1 = container.Resolve<Driver>();// injects BMW driver1.RunCar(); Driver driver2 = container.Resolve<Driver>("LuxuryCarDriver");// injects Audi driver2.RunCar();
示例三,多个构造函数参数:
相关定义:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface ICarKey { } public class BMWKey : ICarKey { } public class AudiKey : ICarKey { } public class FordKey : ICarKey { } public class Driver { private ICar _car = null; private ICarKey _key = null; public Driver(ICar car, ICarKey key) { _car = car; _key = key; } public void RunCar() { Console.WriteLine("Running {0} with {1} - {2} mile ", _car.GetType().Name , _key.GetType().Name, _car.Run()); } }
相关使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var container = new UnityContainer(); container.RegisterType<ICar, Audi>(); container.RegisterType<ICarKey, AudiKey>(); var driver = container.Resolve<Driver>(); driver.RunCar();
示例四,多个构造函数:
相关定义不变,将使用部分代码改为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Driver { private ICar _car = null; [InjectionConstructor] public Driver(ICar car) { _car = car; } public Driver(string name) { } public void RunCar() { Console.WriteLine("Running {0} - {1} mile ", _car.GetType().Name, _car.Run()); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
container.RegisterType<Driver>(new InjectionConstructor(new Ford())); //or container.RegisterType<ICar, Ford>(); container.RegisterType<Driver>(new InjectionConstructor(container.Resolve<ICar>()));
示例五,基类型作为构造函数参数:
相关定义:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Driver { private ICar _car = null; private string _name = string.Empty; public Driver(ICar car, string driverName) { _car = car; _name = driverName; } public void RunCar() { Console.WriteLine("{0} is running {1} - {2} mile ", _name, _car.GetType().Name, _car.Run()); } }
相关使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var container = new UnityContainer(); container.RegisterType<Driver>(new InjectionConstructor(new object[] { new Audi(), "Steve" })); var driver = container.Resolve<Driver>(); // Injects Audi and Steve driver.RunCar();
完整请参考:
http://www.tutorialsteacher.com/ioc/constructor-injection-using-unity-container