zoukankan      html  css  js  c++  java
  • Unity IOC容器的构造函数使用笔记(不能错过的Unity示例)

    示例一,正常使用:

    相关定义:

    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());
        }
    }
    View Code

    使用:

    var container = new UnityContainer();
    container.RegisterType<ICar, BMW>();
    
    var driver = container.Resolve<Driver>();
    driver.RunCar();
    View Code

    我们使用Resolve来解析我们想要的调用对象,在这里是Driver。

    示例二,多个注入:

    相关定义的代码不变,将使用部分的代码改为:

    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();
    View Code

    示例三,多个构造函数参数:

    相关定义:

    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());
        }
    }
    View Code

    相关使用:

    var container = new UnityContainer();
                
    container.RegisterType<ICar, Audi>();
    container.RegisterType<ICarKey, AudiKey>();
    
    var driver = container.Resolve<Driver>();
    driver.RunCar();
    View Code

    示例四,多个构造函数:

    相关定义不变,将使用部分代码改为:

    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());
        }
    }
    View Code
    container.RegisterType<Driver>(new InjectionConstructor(new Ford()));
    
    //or 
    
    container.RegisterType<ICar, Ford>();
    container.RegisterType<Driver>(new InjectionConstructor(container.Resolve<ICar>()));
    View Code

    示例五,基类型作为构造函数参数:

    相关定义:

    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());
        }
    } 
    View Code

    相关使用:

    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();
    View Code

    完整请参考:

    http://www.tutorialsteacher.com/ioc/constructor-injection-using-unity-container

  • 相关阅读:
    敏捷开发设计模式的五大原则(读敏捷软件开发:原则、模式与实践笔记记录一下)
    使用AOP和Semaphore对项目中具体的某一个接口进行限流
    java正则使用全记录!
    推荐一本书学习springcloud书籍的SpringCloud微服务全栈技术与案例解析
    使用springboot Admin 2.0.6版本 集成监控springcloud微服务应用
    推荐一本学习Groovy的书籍Groovy程序设计!
    Datagrip 快捷键和常用插件持续更新一集一些使用技巧
    Eclipse中项目不会自动编译问题的坑和注意点
    使用Groovy的mixin方法注入,和mixedIn属性实现过滤链
    vscode常用快捷键和插件(持续更新),以及一些常用设置的坑和技巧
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/9026749.html
Copyright © 2011-2022 走看看