架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 191|回复: 3

[资料] 在MVC 中使用 autofac 实现自动注册

[复制链接]
发表于 2019-11-20 09:44:39
zu
思路很简单:首先我们去找到所有Dll,再去找到实现了IAutoInject 接口的类,然后使用RegisterAssemblyTypes进行注入。IAutoInject是一个空接口,用来辅助我们寻找需要注册的接口

1. 在控制台执行命令安装AutoFac组件

  1. Install-Package Autofac
  2. Install-Package Autofac.Mvc5 -Version 4.0.2
复制代码


2. 定义IAutoInject接口

  1. public interface IAutoInject { }
复制代码


3. 在Application_Start()中初始化
获取项目所有程序集方法:

.Net Core 获取项目所有程序集,排除Microsoft、Nuget包
https://www.itsvse.com/thread-8994-1-1.html
(出处: 架构师_程序员)
  1. protected void Application_Start()
  2.         {
  3.             var builder = new ContainerBuilder();
  4.             //获取IAutoInject的Type
  5.             var baseType = typeof(IAutoInject);
  6.             //获取所有程序集
  7.             var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();
  8.             //自动注册接口
  9.             builder.RegisterAssemblyTypes(assemblies).Where(b => b.GetInterfaces().
  10.             Any(c => c == baseType && b != baseType)).AsImplementedInterfaces(). InstancePerLifetimeScope();
  11.             //自动注册控制器
  12.             builder.RegisterControllers(assemblies);
  13.             var container = builder.Build();
  14.             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

  15.             AreaRegistration.RegisterAllAreas();
  16.             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  17.             RouteConfig.RegisterRoutes(RouteTable.Routes);
  18.             BundleConfig.RegisterBundles(BundleTable.Bundles);
  19.         }
复制代码



注意:获取程序集的错误写法(该写法在回收程序池后会导致注册信息丢失): var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToArray();


4. 编写测试代码

  1.   public interface IStudent: IAutoInject
  2.     {
  3.         string Test();
  4.     }
复制代码
  1.     public class Student : IStudent
  2.     {
  3.         public string Test()
  4.         {
  5.             return "ok";
  6.         }
  7.     }
复制代码
  1.         public class HomeController : Controller
  2.     {
  3.         private IStudent _student;

  4.         public HomeController(IStudent student)
  5.         {
  6.             _student = student;
  7.         }

  8.         public ActionResult Index()
  9.         {
  10.             return Content(_student.Test());
  11.         }
  12.     }
复制代码
访问Home/index 即可看到ok成功输出





上一篇:PS 调色&amp;滤镜插件
下一篇:.Net Core 获取项目所有程序集,排除Microsoft、Nuget包
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-11-20 10:38:53
如果接口是泛型,判断如下:

  1. var baseType = typeof(IBaseService<,>);
  2.             var assemblies = Common.RuntimeHelper.GetAllAssemblies("itsvse").ToArray();
  3.             builder.RegisterAssemblyTypes(assemblies).Where(b => b.GetInterfaces().
  4.             Any(c => c.IsGenericType && c.GetGenericTypeDefinition().IsAssignableFrom(baseType) && b != baseType)).EnableClassInterceptors().InterceptedBy(typeof(AopService)).AsImplementedInterfaces().InstancePerLifetimeScope().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
复制代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-11-20 10:39:23
判断属性是否是集合泛型

  1. //属性是集合
  2.                 if (item.PropertyType.IsGenericType && item.PropertyType.GetGenericTypeDefinition().Equals(typeof(List<>)))
  3.                 {
  4.                     List<object> list = item.GetValue(model, null) as List<object>;
  5.                     foreach (var item_row in list)
  6.                     {

  7.                     }
  8.                 }
复制代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-11-20 10:46:42
  1. // 首先注册 options,供 DbContext 服务初始化使用
  2.             builder.Register(c =>
  3.             {
  4.                 var optionsBuilder = new DbContextOptionsBuilder<DolphinDb>();
  5.                 optionsBuilder.UseMySql(Configuration.GetConnectionString("DefaultConnection"));
  6.                 return optionsBuilder.Options;
  7.             }).InstancePerLifetimeScope();
复制代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2020-1-19 14:53

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表