1. 程式人生 > 實用技巧 >Autofac 元件註冊與服務解析

Autofac 元件註冊與服務解析

元件:元件可以是一個.Net類也可以是一個表示式,同時也可以是一個暴露一個或多個服務的的一段程式碼,同時元件可以引用其他的依賴。

服務:通常是一個介面(即使用者通過介面來使用元件),也可以是.Net類(即元件可以暴露自己給使用者作為一個服務),暴露給使用者,是使用者使用元件的通道。

依賴:一個被元件需要的服務

建立服務和元件

    /// <summary>
    /// 暴露的服務 IOutput
    /// </summary>
    public interface IOutput
    {
        void Write(string content);
    }

    
/// <summary> /// 元件 ConsoleOutput /// </summary> public class ConsoleOutput : IOutput { public void Write(string content) { Console.WriteLine(content); } }

元件註冊與服務解析

    class Program
    {
        private static IContainer Container { get
; set; } static void Main(string[] args) { var builder = new ContainerBuilder(); // 註冊元件 ConsoleOutput 並且把元件 ConsoleOutput 暴露為服務 IOutput builder.RegisterType<ConsoleOutput>().As<IOutput>(); Container = builder.Build(); Test(); Console.Read(); }
public static void Test() { using(var scope= Container.BeginLifetimeScope()) { // outPut為解析服務(依賴) IOutput 後構造的元件 ConsoleOutput 例項 var outPut = scope.Resolve<IOutput>(); outPut.Write("Hello World"); // 出錯:The requested service 'AutofacTest.ConsoleOutput' has not been registered var outPutSelf = scope.Resolve<ConsoleOutput>(); } } }

執行結果:

程式碼" outPut.Write("Hello World")" 正常執行,輸出"Hello World";但是程式碼" var outPutSelf = scope.Resolve<ConsoleOutput>()"報錯 "The requested service 'AutofacTest.ConsoleOutput' has not been registered "

原因:

outPut能夠正常解析,因為需要解析的服務 IOutput 已經註冊了 元件ConsoleOutput 所有會構造一個ConsoleOutput 例項給outPut變數;

outPutSelf 需要解析服務ConsoleOutput 但是目前服務ConsoleOutput 找不到對應的註冊元件,導致報錯

解決方法:

註冊元件ConsoleOutput 並且暴露為服務ConsoleOutput ,即加上如下程式碼:

builder.RegisterType<ConsoleOutput>().AsSelf();

或者下面這行程式碼:

builder.RegisterType<ConsoleOutput>();

如下圖: