按参数值不同实现不同的注册

 

一、定义接口

public interface InterfaceDao
    {
        public virtual void DoSomething(string type) { }
    }

二、定义实现类

/// <summary>
    /// 唱歌
    /// </summary>
    public class Sing : InterfaceDao
    {
        public  void DoSomething(string type)
        {
            Console.WriteLine("Lets Sing");
        }
    }
    /// <summary>
    /// 跳舞
    /// </summary>
    public class Dance : InterfaceDao
    {
        public  void DoSomething(string type)
        {
            Console.WriteLine("Lets Dance");
        }
    }
    /// <summary>
    /// 自由活动
    /// </summary>
    public class Other : InterfaceDao
    {
        public void DoSomething(string type)
        {
            Console.WriteLine("Lets play free");
        }
    }

三、设定根据不同的参数实现不同的实体进行注册

在本例中,由三个类实现,并且实例化哪个类取决于运行时提供type

static void Main(string[] args)
        {
            //创建一个容器创建者
            var builder = new ContainerBuilder();
            //使用lambda表达式注册
            builder.Register<InterfaceDao>((c,p) =>
            {
                //通过不同参数进行不同实例的注册
                string type = p.Named<string>("type");
                if (type == "dance")
                {
                    return new Dance();
                }else if (type == "sing")
                {
                    return new Sing();
                }
                {
                    return new Other();
                }
            });
            var service = builder.Build();
            using (var scope = service.BeginLifetimeScope())
            {
               //通过不同参数获取不同的实例
               var interfaceDao = scope.Resolve<InterfaceDao>(new NamedParameter("type", "dance"));
               interfaceDao.DoSomething("kkk");
            }
            Console.WriteLine("Hello World!");
        }

 

创建隔离组件的最大好处之一是,具体类型可以多种实现。这通常在运行时完成,而不仅仅是在配置时。