十年河東,十年河西,莫欺少年窮
學無止境,精益求精
新建一個控制檯程序,如下
MyAutoFac項目 引用Nuget autofac V6.5版本
新建如下接口:
public interface 動物 { void 叫聲(); public virtual void 乾飯() { Console.WriteLine("喫主人準備好的飯菜"); } }
實現類如下:
namespace MyService { public class 狗 : 動物 { public void 叫聲() { Console.WriteLine("汪汪汪"); } public void 乾飯() { Console.WriteLine("偶爾喫屎"); } } public class 貓 : 動物 { public void 叫聲() { Console.WriteLine("喵喵喵"); } } }
1、注入普通類
{ //註冊一個普通類 ContainerBuilder builder = new ContainerBuilder(); builder.RegisterType<狗>().As<狗>(); IContainer container = builder.Build(); var 二哈 = container.Resolve<狗>(); 二哈.乾飯(); }
2、注入接口及實現類
{ //註冊接口,及實現類 ContainerBuilder builder = new ContainerBuilder(); builder.RegisterType<貓>().As<動物>(); IContainer container = builder.Build(); var 中華田園貓 = container.Resolve<動物>(); 中華田園貓.叫聲(); }
3、通過程序集註入
3.1、僅注入service層
{ //通過程序集加載-->只加載Service ContainerBuilder builder = new ContainerBuilder(); Assembly assemblyService = Assembly.LoadFrom("MyService.dll"); builder.RegisterAssemblyTypes(assemblyService).AsSelf(); IContainer container = builder.Build(); var 中華田園貓 = container.Resolve<貓>(); 中華田園貓.叫聲(); var 哈士奇 = container.Resolve<狗>(); 哈士奇.叫聲(); }
3.2、注入接口層和實現層
因爲存在一個接口多個實現類,因此,需要解析爲對象集合IEnumerable<動物>
{ //通過程序集加載 ContainerBuilder builder = new ContainerBuilder(); Assembly assemblyInterface = Assembly.LoadFrom("MyInterface.dll"); Assembly assemblyService = Assembly.LoadFrom("MyService.dll"); builder.RegisterAssemblyTypes(assemblyInterface, assemblyService).AsImplementedInterfaces(); IContainer container = builder.Build(); //---> 動物下的基類有貓和狗 var 動物集合 = container.Resolve<IEnumerable<動物>>(); foreach (var item in 動物集合) { item.乾飯(); } }
@天才臥龍的波爾卡