.Net 依赖注入以及AOP切面
.Net 依赖注入
参考地址
https://www.cnblogs.com/webapi/p/10563735.html
https://www.cnblogs.com/xyh9039/archive/2019/08/07/11318247.html
https://www.cnblogs.com/Warmsunshine/p/9067321.html
为什么要使用依赖注入
依赖注入
- 如果类A的实现需要借助类B,那么类B就被称作类A的依赖。需要交给ICO容器去解耦。
- 把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入
微软文档
简单说明
个人理解依赖注入
- 1.Startup 添加服务注册的生命周期 AddSingleton,AddTransient,AddScoped
- 2.控制器构造函数要求传入 接口,将本地的接口赋值
控制反转(IOC)
老张 依赖注入系列
https://www.cnblogs.com/laozhang-is-phi/p/9541414.html //里面也是包含了依赖注入
https://www.cnblogs.com/laozhang-is-phi/p/11520048.html //上面文章是2.0,3.0需要看这个
MVC依赖注入以及AOP切面编程
Nuget
Autofac.Extras.DynamicProxy //动态代理,用于AOP,安装会自动安装依赖 Autofac
Autofac.Mvc //mvc 依赖注入
需要注入的类
public interface ITestSayHello
{
void Say();
}
public class TestSayHello : ITestSayHello
{
public virtual void Say()
{
Console.WriteLine("Hello");
}
}
需要的AOP切面类
public class AOPTest : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("开始前");
invocation.Proceed();
Console.WriteLine("开始后");
}
}
Global.asax 修改
Application_Start 方法增加
MvcContainer.Register();//autofac:控制反转,依赖注入配置
创建代理类
public static class MvcContainer
{
public static void Register()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetCallingAssembly())//注册mvc的Controller
.PropertiesAutowired();//属性注入
builder.RegisterType<AOP.AOPTest>();//AOP注册
builder.RegisterType<TestTemp.TestSayHello>()
.AsImplementedInterfaces()//自动以其实现的所有接口类型暴露(包括IDisposable接口)
.EnableClassInterceptors()//动态AOP代理
.InterceptedBy(typeof(AOP.AOPTest));
//也可以直接类注入,不过类里面的方法需要用虚方法实现
//移除原本的mvc的容器,使用AutoFac的容器,将MVC的控制器对象实例交由autofac来创建
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
配合EF使用,不使用接口,直接类注册
https://www.cnblogs.com/daryl/p/7778190.html 三种生命周期
public static void Register()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetCallingAssembly())//注册mvc的Controller
.PropertiesAutowired();//属性注入
// builder.RegisterType<AOP.AOPTest>().EnableClassInterceptors(); AOP切面注入
builder.RegisterType<DB>().InstancePerLifetimeScope();//全局注册 db实例
builder.RegisterType<Helper.EFHelper>();//ef通用查询方法
//移除原本的mvc的容器,使用AutoFac的容器,将MVC的控制器对象实例交由autofac来创建
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
Api依赖注入
原本我以为在mvc完成依赖注入后,可以直接调用 ApiController 依赖注入,却发现报错了
报错内容 类型Controllers.ApiController”没有默认构造函数
后来一查,原来之前安装的是mvc依赖注入,api也有专门的依赖注入 Autofac.WebApi2
安装Autofac.WebApi2
原先的需要修改如下
public static void Register()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetCallingAssembly())//注册mvc的Controller
.PropertiesAutowired();//属性注入
builder.RegisterApiControllers(Assembly.GetCallingAssembly())//注册Api的Controller
.PropertiesAutowired();//属性注入
// builder.RegisterType<AOP.AOPTest>().EnableClassInterceptors(); AOP切面注入
builder.RegisterType<OAData>().InstancePerLifetimeScope();//全局注册
builder.RegisterType<Helper.EFHelper>();//ef通用查询方法
//移除原本的mvc的容器,使用AutoFac的容器,将MVC的控制器对象实例交由autofac来创建
var container = builder.Build();
#region Api依赖注入
HttpConfiguration config = GlobalConfiguration.Configuration;//注意此处HttpConfiguration类的 config对象,一定不要new,要从GlobalConfiguration获取
config.DependencyResolver = (new AutofacWebApiDependencyResolver(container));
#endregion
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}