Autofac 元件註冊與服務解析
阿新 • • 發佈:2020-11-25
元件:元件可以是一個.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>();
如下圖: