# SunnyPaine.Autofac.Extension **Repository Path**: sunnypaine/AutofacExtension ## Basic Information - **Project Name**: SunnyPaine.Autofac.Extension - **Description**: 实现Autofac全自动按需扫描、按需注入、按需接口实现、根据名称为标识符属性注入、配置信息创建的扩展功能。 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2022-08-29 - **Last Updated**: 2025-09-09 ## Categories & Tags **Categories**: utils **Tags**: None ## README # Autofac.Extension ## 获取包 获取方式一:访问 https://gitee.com/sunnypaine/Autofac.Extension 获取源码进行编译。 获取方式二:访问 https://www.nuget.org/ 搜索 “SunnyPaine.Autofac.Extension ” 获取。 获取方式三:通过Visual Studio 的 NuGet 管理器获取。 ## 快速开始 ### SunnyPaine.Autofac.Extension.Stereotype 的使用 #### 简介 _SunnyPaine.Autofac.Extension.Stereotype 是单纯对Autofac的扩展。通过特性标记全自动的扫描接口、类、方法、属性等,不再需要人为的去书写实例注入的代码。手动注入实例例如:_ ```csharp builder.RegisterType().As(); ```
#### 特性标记的使用 当前可使用的特性有: 1. DataAccessAttribute _该特性用于数据层(DAL层或Dao层接口的实现类)_ 2. ServiceAttribute _该特性用于业务逻辑层(BLL层或Service层)_ 3. ControllerAttribute _该特性用于控制层,也可以用于WPF的ViewModel_ 4. InjectAttribute _该特性用于标记接口是否被注入实例。Scanner类的构造方法提供了多个重载,并提供了“是否使用接口标记符 InjectAttribute 进行扫描”的开关,默认为false。当为false时,类的所有接口都会被注入实例的引用。当为true时,类的所有接口里只有标记了 InjectAttribute 特性的接口才会被注入实例的引用。InjectAtrribute 特性的存在是为了增强实例的引用的个性化操作,使得接口的权限更加灵活。_ 5. ConfigureAttribute _该特性用户标记配置信息。例如 数据库信息配置,Redis实例配置,雪花算法配置等等。_ 6. BeanAttribute _该特性基于 ConfigureAttribute ,只有当类标记了 ConfigureAttribute 特性后,BeanAttribute 特性才会被扫描,BeanAttribute 特性作用域方法,方法的名称必须是Get开头,例如GetRedisTemplate():_ ```csharp [Configure] public class RedisConfig { [Bean] public RedisTemplate GetRedisTemplate() { return new RedisTemplate("192.168.0.1", 6379); } } ``` 7. ResourceAttribute _该特性作用于属性,给标记了 ResourceAtrribute 特性的属性注入对应**名称**的实例的引用。如果 Name 为空,则以属性的名称查找。_ 8. AutowiredAttribute _该特性作用于属性,给标记了 AutowireAttribute 特性的属性注入对应**类型**的实例的引用。_ 9. ComponentAttribute _改特性作用于类,表示类将被作为实例扫描并加入容器中。是 ConfigureAttribute,ControllerAttribute,ServiceAtrribute,DataAccessAttribute 的基类。_
#### 创建Autofac并启动扫描与注入 ```csharp //创建Autofac的IOC容器 ContainerBuilder builder = new ContainerBuilder(); //启用自动实例注册 builder.UseAutoRegister();//默认不启用InjectAttribute特性标记 //builder.UseAutoRegister(true);//启用InjectAttribute特性标记 //自动实例注册 builder.Register(); //构建IOC实例 IContainer container = builder.Build(); //构建IOC后执行的事情,实现IBuildAfter接口,可以自定义扩展。BuildAfter是提供的默认实现 container.BuildAfter(new BuildAfter()); ```
### SunnyPaine.Autofac.Extension.SqlSugar 的使用 #### 简介 _SunnyPaine.Autofac.Extension.SqlSugar 是集成了Autofac框架并进行了扩展。该工程需要引入SunnyPaine.Autofac.Extension.Stereotype的依赖。它沿用了SunnyPaine.Autofac.Extension.Stereotype的自动注册,同时集成了基于SqlSugar的事务,并通过拦截器自动注入:_ ```csharp //创建Autofac容器 ContainerBuilder builder = new ContainerBuilder(); //启用自动注册实例 builder.UseAutoRegister(); //启用SqlSugar扩展 builder.UseSqlSugar(connectionInfo: GetConnectionInfos()); //注册实例,重写了Injecter.Register(ContainerBuilder)。请勿与Injecter.Register(ContainerBuilder)混用,否则可能导致实例污染 builder.RegisterEx(); //构建IOC实例 IContainer container = builder.Build(); //构建IOC后执行的事情,实现IBuildAfter接口,可以自定义扩展。BuildAfter是提供的默认实现 //使用其它扩展组件时,加上这句代码,container对象才能正常被使用 container.BuildAfter(new BuildAfter()); ``` #### 特性标记的使用 当前可使用的特性有: 1. TransactionAttribute _该特性用于 Controller 层或者 Service 层(建议用于 Service 层)的事务管理,当类使用了该特性,表示该类支持数据库事务。_ 2. TransactionScopeAttribute _该特性用于标记了 TransactionAttribute 特性的类中的方法。它作用于方法上,表明该方法将通过事务处理。_
### SunnyPaine.Autofac.Extension.Mvvm 的使用 #### 简介 _SunnyPaine.Autofac.Extension.Mvvm 是集成了Autofac框架并进行了扩展。该工程需要引入SunnyPaine.Autofac.Extension.Stereotype的依赖。它使用SunnyPaine.Autofac.Extension.Stereotype进行自动注册,并自动关联View和VIewModel,并提供事件自动关联绑定、Behavior自动注入的功能(该思路来源于DevExpress,真诚感谢DevExpress的思路):_ 1. 将App.xaml中的StartupUri删掉,如图: ![App.xaml](https://gitee.com/sunnypaine/AutofacExtension/raw/master/pics/1.png) 2. 在App.cs中添加如下代码: ```csharp //重写 OnStartup 方法 protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); //********************重要说明***************************// //1.在非特殊情况下,Windows窗口通常不为单例,所以注册根据业务需要决定是否使用单例注册 //2.使用builder.UseAutoRegister();自动实例注册时,所有被ComponentType枚举指示的特性,默认都是单例注入, // 而Windows窗口和它的ViewModel应当是一对一的关系,所以ViewModel使用Controller特性标记后,应当将Controller的Scope属性设置为true,以保证非单例注册。 //3.如果不启用Mvvm扩展,则使用以下方式注册视图和组件,视图和组件需要手动注册 // builder.RegisterWindow("Window1"); // builder.RegisterWindow("Window2"); // builder.RegisterControl("UserControl1"); // builder.RegisterControl("UserControl2"); ContainerBuilder builder = new ContainerBuilder();//创建Autofac的IOC容器 builder.UseAutoRegister();//启用自动实例注册 builder.UseMvvm();//启用MVVM扩展 builder.SetMainWindow();//设置主窗口 //builder.RegisterModule(new HostModule());//手动实例注册 builder.Register();//自动实例注册,builder.UseAutoRegister()的后续 builder.RegisterView();//注册视图,builder.UseMvvm()和builder.SetMainWindow()的后续 IContainer container = builder.Build();//构建IOC实例 container.BuildAfter(new BuildAfter());//构建IOC后执行的事情 container.ShowMainWindow();//显示主窗口 } ``` 3. MainWindow.xaml.cs中关联DataContext和ViewModel,代码入下: ```csharp //通过属性注入,使用类型注入 [Autowired] private IMainViewModel ViewModel { get { return (IMainViewModel)this.DataContext; } set { this.DataContext = value; } } //通过属性注入,使用名称注入 [Resource(Name = "MainViewModel")] private IMainViewModel ViewModel { get { return (IMainViewModel)this.DataContext; } set { this.DataContext = value; } } //通过构造器注入 public MainWindow(IMainViewModel viewModel) { this.InitializeComponent(); this.DataContext = viewModel; } ``` 4. MainViewModel.cs中,代码如下: ```csharp [Controller(Scope = true)] public class MainViewModel : BasicViewModel, IMainViewModel { public MainViewModel() {} } ``` #### 命令的绑定 _命令的绑定主要通过 CommandAttribute 特性来实现。_ _以Button为例,Command 属性绑定一个命令名称,例如为 LoginCommand,在 ViewModel 中代码如下:_ ```csharp //使用匿名名称,表示通过匿名名称(方法名称+Command,即LogingCommand),自动绑定UI中的命令 [Command] private void Login() { Console.Write("asdfasdfdsaf"); } //使用指定名称 [Command(Name = "LoginCommand")] private void Login() { Console.Write("asdfasdfdsaf"); } ``` #### 特性标记的使用 当前可使用的特性有: 1. CommandAttribute _该特性用于ViewModel层命令的绑定。_
#### 其它 _详细使用,可参考解决方案中的Test案例。_ _欢迎大佬们提出建设性意见和建议。共勉!!!_