.NetFramework框架不提供默认依赖注入容器对依赖注入技术进行实现,如果所开发程序项目是基于.NetFramework框架且这个项目需要使用依赖注入技术进行实现,常用的手段有两种:

1、使用微软自己提供MEF(Managed Extensibility Framework(托管可扩展框架)) 容器,MEF对应.NetFramework和.NetCore框架分别有两个不同的版本,.NetFramework框架使用MEF的版本需要引用程序集中的“System.ComponentModel.Composition”。而.NetCore框架使用MEF的版本则需要通过NuGet插入依赖“System.Composition”。

2、使用第三方Autofac依赖注入容器对依赖注入技术进行实现。

    通过在接口以及相应的属性上定义对应的[Export]--[Import]注解,MEF隐式的实例化类型对象。通过MEF依赖注入容器通过[Export]--[Import]注解实现依赖注入相比于默认赖注入容器和Autofac依赖注入容器其依赖注入的实现是最为容易的,所需要的代码量也是最少的。这也侧面反映出MEF的封装相比来说也是最为黑盒和严密的,开发者也是最难以理解其内部实现逻辑的。

#region 方法--重写

        /// <summary>

        /// 【模型创建】

        /// <param name="modelBuilder">模型生成器实例。</param>

        /// <remarks>

        /// 摘要:

        ///     OnModelCreating方法可以被用来重载与定制规定我们的模型类如何与我们的数据表进行映射的映射规则。

        /// </remarks>

        /// </summary>

        protected override void OnModelCreating(DbModelBuilder modelBuilder)

        {

            //移除复数表名的契约,即实体类与数据库表名的单复数形式相同

            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

 

            if (MappingConfigurationEnumerable == null)

            {

                return;

            }

 

            //逐一的从映射配置实例集合的枚举数实例中选出一个指定的映射配置实例,在数据库中映射并生成符合此映射规则相应的表和字段。

            foreach (var item in MappingConfigurationEnumerable)

            {

                item.ApplyConfiguration(modelBuilder.Configurations);

            }

        }

        #endregion

 

  #region 方法--重写

        /// <summary>

        /// 【模型创建】

        /// <param name="modelBuilder">模型生成器实例。</param>

        /// <remarks>

        /// 摘要:

        ///     OnModelCreating方法可以被用来重载与定制规定我们的模型类如何与我们的数据表进行映射的映射规则。

        /// </remarks>

        /// </summary>

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

            //动态加载所有实体映射配置实体。

            //  通过程序集查找继承于指定父类的类型,找到后动态加载所有实体映射配置实体,

            //实际上通过程序集查找获取指定类型的实例,而不通过“new”关键字获取指定类型的实例,

            //就是依赖注入的一种方式,此方式被称为:叫“依赖查找”(Dependency Lookup)。

            IEnumerable<Type> _entityTypeConfigurationEnumerable = Assembly.GetExecutingAssembly().GetTypes().Where(type =>

                (type.BaseType?.IsGenericType ?? false)

                    && (type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)));

 

            foreach (Type item in _entityTypeConfigurationEnumerable)

            {

                IMappingConfiguration _mappingConfiguration = (IMappingConfiguration)Activator.CreateInstance(item);

                _mappingConfiguration.ApplyConfiguration(modelBuilder);

            }

 

            base.OnModelCreating(modelBuilder);

        }

        #endregion

       通过两个重写方法OnModelCreating的对比,可以发现MEF依赖注入的实现相比于其它的容器得更加的灵活。

/// <summary>

    /// 【MEF依赖关系解析--类】

    /// <remarks>

    ///     宿主MEF并组合部件,用于对程序中相应对应的[Export]--[Import]注解对进行组合操作。

    /// </remarks>

    /// </summary>

    public class MefDependencySolver

    {

        #region 属性--静态

        /// <summary>

        /// 【容器】

        /// <remarks>

        /// 摘要:

        ///    宿主MEF并组合部件,用于对程序中相应对应的[Export]--[Import]注解对进行组合操作。

        /// </remarks>

        /// </summary>

        public static CompositionContainer Container

        {

            get

            {

                AggregateCatalog _aggregateCatalog = new AggregateCatalog();

                _aggregateCatalog.Catalogs.Add(new DirectoryCatalog(Directory.GetCurrentDirectory()));

                _aggregateCatalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));

                CompositionContainer _compositionContainer = new CompositionContainer(_aggregateCatalog);

 

                //将部件(part)和宿主程序添加到组合容器

                return _compositionContainer;

            }

        }

        #endregion

    }

       通过MefDependencySolver类,可以看出MEF也可以通过程序集结接口和相应的实现进行组合。

        Autofac依赖注入容器,通过下列代码在.NetFramework框架实现依赖注入。

       //创建autofac管理注册类的容器实例。

            var builder = new ContainerBuilder();

            builder.RegisterControllers(typeof(TeacherGroupController).Assembly);//注册所有的Controller

            //注册所有实现了 IDependency 接口的类型。

            builder.RegisterType<EFContext>().As<IDBContext>().InstancePerLifetimeScope();

            builder.Register(context => new UnitOfWork(new EFContext())).As<IUnitOfWork>().InstancePerLifetimeScope();

            IContainer container = builder.Build();

            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

而Autofac依赖注入的实现是通过拷贝构造方法显式的实例化类型对象。

19-12-25_MEFFramework(001控制台动态实例UnitOfWork调用模式,完成Insert、Update、Delete数据操作验证) -- https://download.csdn.net/download/zhoujian_911/12053595。

19-12-25_MEFFramework(002WEB动态实例UnitOfWork--MiniProfiler调用模式) --https://download.csdn.net/download/zhoujian_911/12053602。

AutofacFramework(001控制台调用Main方法通过Autofac实现的依赖注入,UnitOfWork调用模式) --https://download.csdn.net/download/zhoujian_911/12053616。

19-12-04_AutofacFramework(002WEB动态实例UnitOfWork--MiniProfiler调用模式,通过Autofac依赖注入) -- https://download.csdn.net/download/zhoujian_911/12053622

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐