C#中依賴注入

因爲客戶類只依賴於服務類的一個接口,而不依賴於具體服務類,因此客戶只定義一個注入點。在程序運行過程當中,客戶類部直接實例化具體服務類實例,而是客戶類的運行上下文環境或者專門組建負責實例化服務類,而後將其注入到客戶類中,保證客戶類的正常運行。函數

 

依賴注入的方法大體分爲3中:接口注入、構造方法注入、setter注入;this

一、setter注入spa

setter注入是指客戶類中設置一個服務類接口類型的數據成員,並設置一個set方法做爲注入點,這個set方法接收一個劇吐的服務類實例爲參數,並將它賦給接口類型的數據成員。具體實例以下:code

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp1.SetterInjection
{
    interface IServiceClass
    {
        string ServiceInfo();
    }


    internal class ServiceClassA:IServiceClass
    {
        public string ServiceInfo() => "類A";
    }
    internal class ServiceClassB:IServiceClass
    {
        public string ServiceInfo() => "類B";
    }
    internal class ClientClass
    {
        private IServiceClass _serviceClass;
        public void Set_Service(IServiceClass service)
        {
            this._serviceClass = service;
        }
        public void ShowInfo()
        {
            Console.WriteLine(_serviceClass.ServiceInfo());

        }
    }
}

 

 

二、構造函數注入接口

經過客戶類的構造函數想客戶注入服務類實例。內存

構造注入是指在客戶類中,設置一個服務類接口的數據成員,並以構造函數爲注入點,這個構造函數接收一個具體的服務類實例參數,並將它賦給服務類接口類型的數據成員。get

具體代碼實例以下:string

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp1.SetterInjection
{
    interface IServiceClass
    {
        string ServiceInfo();
    }


    internal class ServiceClassA:IServiceClass
    {
        public string ServiceInfo() => "類A";
    }
    internal class ServiceClassB:IServiceClass
    {
        public string ServiceInfo() => "類B";
    }
    
    internal class ClientClassInjection
    {
        private IServiceClass _service;
        public ClientClassInjection(IServiceClass service) => _service = service;
        public void ShowInfo()
        {
            Console.WriteLine(_service.ServiceInfo());
        }
    }
}

 

 

三、接口注入it

接口是一種約束、是一種規範,具體實例代碼以下:io

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp1.IOC
{
    //硬盤接口
    interface IHardDisk
    {
        string Name { get; }//硬盤的名字屬性
        void Read();//讀數據方法
        void Write(string str);//寫數據方法
    }
    internal class HardDisk200 : IHardDisk
    {
        public string Name { get => "200G內存的硬盤";  }

        public void Read()
        {
            Console.WriteLine("我能夠寫入數據。。。。。。。");
        }

        public void Write(string str)
        {
            Console.WriteLine(str);
        }
    }


    internal class HardDisk1T:IHardDisk
    {
        public string Name => "1T內存的硬盤";
        public void Read()
        {
            Console.WriteLine("我能夠寫入數據。。。。。。。");
        }

        public void Write(string str)
        {
            Console.WriteLine(str);
        }
    }


    public class Test
    {
        public static void test()
        {
            IHardDisk hardDisk = new HardDisk200();
            hardDisk.Read();
            hardDisk.Write(hardDisk.Name + "我能夠寫入數據");
            Console.Read();
        }
    }
}
相關文章
相關標籤/搜索