[.Net Core] 簡單使用 Mvc 內置的 Ioc

簡單使用 Mvc 內置的 Ioc

  本文基於 .NET Core 2.0。html

  鑑於網上的文章理論較多,鄙人不才,想整理一份 Hello World(Demo)版的文章。json

 

目錄

  • 場景一:簡單類的使用
  • 場景二:包含接口類的使用
  • 場景三:涉及引用類庫的使用

 

場景一:簡單類的使用

  類 DemoService.cs:post

    public class DemoService
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }

 

  控制器 DemoController.cs:ui

    public class DemoController : Controller
    {
        private readonly DemoService _demoService;

        public DemoController(DemoService demoService)
        {
            _demoService = demoService;
        }

        public IActionResult Index()
        {
            return Json(_demoService.Test());
        }
    }

 

  須要先在 Startup.cs 下的 ConfigureServices() 方法中進行註冊才能使用,這裏提供了三種方法,能夠選擇本身喜歡的方式進行註冊。url

    //方法一
    services.AddSingleton(typeof(DemoService), new DemoService());

    //方法二
    services.AddSingleton(typeof(DemoService));

    //方法三
    services.AddSingleton<DemoService>();

 

 

  執行輸出結果,正常:spa

 

  IOC 的容器目前有三種生命週期 Transient、Scoped 和 Singleton,使用方式大體相同,具體差別不在這裏進行敘述:3d

    //範例
    services.AddTransient(typeof(DemoService));
services.AddScoped
<DemoService>();

 

場景二:包含接口類的使用

  接口 IDemo2Service.cs:日誌

    public interface IDemo2Service
    {
        string Test();
    }

 

  接口實現 Demo2Service.cs:code

    public class Demo2Service : IDemo2Service
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }

 

  控制器 Demo2Controller.cs:htm

    public class Demo2Controller : Controller
    {
        private readonly IDemo2Service _demoService;

        public Demo2Controller(IDemo2Service demoService)
        {
            _demoService = demoService;
        }

        public IActionResult Index()
        {
            return Json(_demoService.Test());
        }
    }

 

  目前須要在類 Startup.cs 中的 ConfigureServices() 方法內新增的註冊方法以下(可選其一):

    //方法一
    services.AddSingleton(typeof(IDemo2Service), new Demo2Service());

    //方法二
    services.AddSingleton(typeof(IDemo2Service), typeof(Demo2Service));

    //方法三
    services.AddSingleton<IDemo2Service, Demo2Service>();

 

 

  輸出結果正常:

 

場景三:涉及引用類庫的使用

  咱們先新增一個用於標識做用的接口 IServiceSupport.cs,該接口沒有包含方法,只是一個標識做用,有點相似 DDD 的聚合根接口 IAggregateRoot: 

    public interface IServiceSupport
    {
    }

 

  接口 IDemo3Service.cs

    public interface IDemo3Service
    {
        string Test();
    }

 

  接口實現 Demo3Service.cs

    public class Demo3Service : IDemo3Service
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }

 

  此次咱們統一編寫一個方法將該類庫下的全部接口和實現進行註冊:

        private static void AddSingletonServices(IServiceCollection services)
        {
            var asm = Assembly.Load(new AssemblyName("IocCoreDemo.Services"));
            var serviceTypes = asm.GetTypes()
                .Where(x => typeof(IServiceSupport).IsAssignableFrom(x) && !x.GetTypeInfo().IsAbstract);

            foreach (var serviceType in serviceTypes)
            {
                foreach (var serviceInterface in serviceType.GetInterfaces())
                {
                    services.AddSingleton(serviceInterface, serviceType);
                }
            }
        }

 

  由於使用了反射,因此須要 using System.Reflection;

  此次咱們在 Startup.cs 類中添加和修改的方法如圖所示:

 

   Startup.cs 類中使用的有效命名空間以下:

using IocCoreDemo.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;
using System.Reflection;

  

  若是注入失敗,執行結果便會如圖所示:

 

  爲何會出現上圖的狀況呢?由於小編忘記把接口 IDemo3Service 繼承自接口 IServiceSupport 了,接下來咱們只須要作出一個繼承的編寫操做便可:

 

  再次執行啓動,結果便如你所料:

 

 原文地址:http://www.cnblogs.com/liqingwen/p/8571366.html


相關的文章:

  《[.Net Core] 簡單讀取 json 配置文件

  《[.Net Core] 簡單使用 Mvc 內置的 Ioc

  《[.Net Core] 簡單使用 Mvc 內置的 Ioc(續)

  《[.Net Core] 在 Mvc 中簡單使用日誌組件

相關文章
相關標籤/搜索