zoukankan      html  css  js  c++  java
  • 在.NET Core中处理一个接口多个不同实现的依赖注入问题

    一、构造函数注入一个接口集合

    Startup.cs

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddTransient<ICar, BaoMa>();
                services.AddScoped<ICar, BenChi>();
                services.AddSingleton<ICar, AoDi>();
            }
    

     接口和类

        public interface ICar
        {
            string GetName(string n);
        }
    
        public class BenChi : ICar
        {
            private Guid g;
            public BenChi()
            {
                g = Guid.NewGuid();
            }
            public string GetName(string n)
            {
                return "我是奔驰,我的主人是" + n + ",guid:" + g;
            }
        }
    
        public class AoDi : ICar
        {
            private Guid g;
            public AoDi()
            {
                g = Guid.NewGuid();
            }
            public string GetName(string n)
            {
                return "我是奥迪,我的主人是" + n + ",guid:" + g;
            }
        }
    
        public class BaoMa : ICar
        {
            private Guid g;
            public BaoMa()
            {
                g = Guid.NewGuid();
            }
    
            public string GetName(string n)
            {
                return "我是宝马,我的主人是" + n + ",guid:" + g;
            }
        }

    /Controllers/AboutController.cs

    public class AboutController : Controller
        {
            private ICar baoma;
            private ICar benchi;
            private ICar aodi;
    
            public AboutController(IEnumerable<ICar> cars)
            {
                this.baoma = cars.FirstOrDefault(h => h.GetType().Name == "BaoMa");
                this.benchi = cars.FirstOrDefault(h => h.GetType().Name == "BenChi");
                this.aodi = cars.FirstOrDefault(h => h.GetType().Name == "AoDi");
            }
    
            public IActionResult Index()
            {
                ViewData["BaoMa"] = baoma;
                ViewData["BenChi"] = benchi;
                ViewData["AoDi"] = aodi;
                return View();
            }
        }

    /Views/About/Index.cshtml

    @{
        ViewData["Title"] = "About Page";
    }
    @using  yilaizhuru2.Car
    @inject IEnumerable<ICar> cars
    
    <div class="text-center">
        <h1 class="display-4">Welcome</h1>
        <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
        <p>@((ViewData["BaoMa"] as BaoMa).GetName("BaoMa"))</p>
        <p>@((ViewData["BenChi"] as BenChi).GetName("BenChi"))</p>
        <p>@((ViewData["AoDi"] as AoDi).GetName("AoDi"))</p>
        <hr />
        <p>@cars.FirstOrDefault(h => h.GetType().Name == "BaoMa").GetName("BaoMa")</p>
        <p>@cars.FirstOrDefault(h => h.GetType().Name == "BaoMa").GetName("BaoMa")</p>
        <p>@cars.FirstOrDefault(h => h.GetType().Name == "BenChi").GetName("BenChi")</p>
        <p>@cars.FirstOrDefault(h => h.GetType().Name == "BenChi").GetName("BenChi")</p>
        <p>@cars.FirstOrDefault(h => h.GetType().Name == "AoDi").GetName("AoDi")</p>
        <p>@cars.FirstOrDefault(h => h.GetType().Name == "AoDi").GetName("AoDi")</p>
    </div>
    

      

    二、利用AddTransient的扩展方法

    Startup.cs

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddTransient<Apple>();
                services.AddScoped<Banana>();
                services.AddSingleton<Watermelon>();
                //https://blog.csdn.net/qin_yu_2010/article/details/86150218
                //注意改成AddTransient,AddSingleton会报错Cannot resolve scoped service 'yilaizhuru2.BenChi' from root provider
                services.AddTransient(factory =>
                {
                    Func<string, IFruit> accesor = key =>
                    {
                        if (key.Equals("Apple"))
                        {
                            return factory.GetService<Apple>();
                        }
                        else if (key.Equals("Banana"))
                        {
                            return factory.GetService<Banana>();
                        }
                        else if (key.Equals("Watermelon"))
                        {
                            return factory.GetService<Watermelon>();
                        }
                        else
                        {
                            throw new ArgumentException($"Not Support key : {key}");
                        }
                    }; return accesor;
                });
            }

    接口和类

        public interface IFruit
        {
            string GetName(string n);
        }
    
        public class Watermelon : IFruit
        {
            private Guid g;
            public Watermelon()
            {
                g = Guid.NewGuid();
            }
            public string GetName(string n)
            {
                return "我是西瓜,我的主人是" + n + ",guid:" + g;
            }
        }
    
        public class Banana : IFruit
        {
            private Guid g;
            public Banana()
            {
                g = Guid.NewGuid();
            }
    
            public string GetName(string n)
            {
                return "我是香蕉,我的主人是" + n + ",guid:" + g;
            }
        }
    
        public class Apple : IFruit
        {
            private Guid g;
            public Apple()
            {
                g = Guid.NewGuid();
            }
            public string GetName(string n)
            {
                return "我是苹果,我的主人是" + n + ",guid:" + g;
            }
        }
    

    /Controllers/HomeController.cs

        public class HomeController : Controller
        {
            private readonly Func<string, IFruit> _serviceAccessor;
            private IFruit apple;
            private IFruit banana;
            private IFruit watermelon;
    
            public HomeController(Func<string, IFruit> serviceAccessor)
            {
                this._serviceAccessor = serviceAccessor;
                this.apple = _serviceAccessor("Apple");
                this.banana = _serviceAccessor("Banana");
                this.watermelon = _serviceAccessor("Watermelon");
            }
    
            public IActionResult Index()
            {
                ViewData["Apple"] = apple;
                ViewData["Banana"] = banana;
                ViewData["Watermelon"] = watermelon;
                return View();
            }
        }
    

    /Views/Home/Index.cshtml

    @{
        ViewData["Title"] = "Home Page";
    }
    @using  yilaizhuru2.Fruit
    @inject Func<string, IFruit> _serviceAccessor
    
    
    <div class="text-center">
        <h1 class="display-4">Welcome</h1>
        <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
        <p>@((ViewData["Apple"] as Apple).GetName("Apple"))</p>
        <p>@((ViewData["Banana"] as Banana).GetName("Banana"))</p>
        <p>@((ViewData["Watermelon"] as Watermelon).GetName("Watermelon"))</p>
        <hr />
        <p>@_serviceAccessor("Apple").GetName("Apple")</p>
        <p>@_serviceAccessor("Apple").GetName("Apple")</p>
        <p>@_serviceAccessor("Banana").GetName("Banana")</p>
        <p>@_serviceAccessor("Banana").GetName("Banana")</p>
        <p>@_serviceAccessor("Watermelon").GetName("Watermelon")</p>
        <p>@_serviceAccessor("Watermelon").GetName("Watermelon")</p>
    </div>
    

      

    参考:

    https://www.cnblogs.com/yilezhu/p/10236163.html

    https://mp.weixin.qq.com/s/e4mO5hJ1qbBk87N41ErdfA?

  • 相关阅读:
    (转)The Road to TensorFlow
    (转) TensorFlow深度学习,一篇文章就够了
    论文笔记之:Fully-Convolutional Siamese Networks for Object Tracking
    关于 Local feature 和 Global feature 的组合
    (转) 技术揭秘:海康威视PASCAL VOC2012目标检测权威评测夺冠之道
    (转)一文学会用 Tensorflow 搭建神经网络
    (转)TensorFlow 入门
    (转)阿尔法狗是怎么用机器学习做决策的
    How to Configure the Gradient Boosting Algorithm
    A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning
  • 原文地址:https://www.cnblogs.com/Zev_Fung/p/10944985.html
Copyright © 2011-2022 走看看