AutoFac自動注入の実現プロセス

今日インタビューに行ったところ、インタビュアーがAutoFacが自動プロセスをどのように実現しているかを尋ねました。私は圧倒されました。私は通常、コードを移動して、詳細な調査なしで使用するだけです。この経験はレッスンと見なすことができます。戻ってきた後、実装プロセスを研究し、それを記録するためのメモを書きました。

1つは、依存性注入インターフェースです。

まず、依存性注入のインターフェースを紹介します

1.マークされたインターフェースが宣言され、このインターフェースから継承されたものがすべて示されます

    /// <summary>
    /// 依赖注入接口,表示该接口的实现类将自动注册到IoC容器中
    /// </summary>
    public interface IDependency
    {
    
    
    }

2.追加、削除、変更、およびチェックの一般的な方法をカプセル化するために、基本的なインターフェースが宣言されています

    public interface IBaseContract<T> : IDependency
	{
    
    
        IQueryable<T> Entities {
    
     get; }
        //OperationResult 是自己封装的一个操作结果,不用在意
        OperationResult Insert(params T[] entities);
        OperationResult Update(params T[] entities);
        T View(int Id);
	}

3.特定のエンティティクラスインターフェイスを宣言すると、いくつかの一意のメソッドをインターフェイスにカプセル化できます

 public interface IStudentContract : IBaseContract<Student>
 {
    
    
      string GetName();
 }

4.
コントローラーのコンストラクターでUseを使用します

 public class HomeController : Controller
    {
    
    
        private IStudentContract _student;

        public HomeController(IStudentContract student)
        {
    
    
            _student = student;
        }

        public ActionResult Index()
        {
    
    
            return Content(_student.GetName());
        }
    }

2.自動注入プロセス

protected void AutofacRegister()
        {
    
    
            var builder = new ContainerBuilder();
            /* 1、注册
             * RegisterGeneric:注册非参数化泛型类型:RegisterGeneric(typeof(类)).As(typeof(接口))
             * RegisterType:通过RegisterType<类>.As<接口>() 来注册不是泛型的类
             */
            builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>));
            

            /* 2、获取接口类型
             * 通过IDependency标记需要依赖注入的接口
             * 注册所有实现了IDependency接口的类型
             */
            Type baseType = typeof(IDependency);


            /* 3、获取所有程序集
             * 当CLR COM服务器初始化时,它会创建一个AppDomain。 AppDomain是一组程序集的逻辑容器
             */
            //var assemblies = AppDomain.CurrentDomain.GetAssemblies();//这种写法AppDomain重新启动后会丢失程序集
            var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();
   
            /* 4、自动注册接口
             * 筛选出对应条件的接口
             * IsAssignableFrom:返回true的条件:是否直接或间接实现了IDependency
             * IsAbstract:是否为抽象类
             * AsImplementedInterfaces:以接口的形式注册
             * InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例
             */
            builder.RegisterAssemblyTypes(assemblies)
                .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)               .AsImplementedInterfaces().InstancePerLifetimeScope();

            /*5、自动注册MVC与api控制器
             */
            builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
                    builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

		   IContainer container = builder.Build();

            /*6、ApiController WebApi注入
             */
            var webapiresolver = new AutofacWebApiDependencyResolver(container); 
            GlobalConfiguration.Configuration.DependencyResolver = webapiresolver;

            /*7、mvc注入
            */
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }

Application_StartメソッドでAutofacRegister()を呼び出します

おすすめ

転載: blog.csdn.net/hhhhhhenrik/article/details/95376870