【无标题】

在.net core中使用Autofac依赖注入

1.创建AutofacModuleRegister类

servicesDllFile,repositoryDllFile是需要注入的类库,
如builder.RegisterAssemblyTypes(assemblysServices),就是配置servicesDllFile路径的类库的注入
public class AutofacModuleRegister : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
var basePath = AppContext.BaseDirectory;
#region 带有接口层的服务注入
var servicesDllFile = Path.Combine(“”);
var repositoryDllFile = Path.Combine(basePath, AppSettingsConstVars.Dal);

    if (!(File.Exists(servicesDllFile) && File.Exists(repositoryDllFile)))
    {
        var msg = "Repository.dll和Services.dll 丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。";
        throw new Exception(msg);
    }

    builder.RegisterType<Context>().As<DbContext>()
           .AsImplementedInterfaces()
           .InstancePerDependency()
           .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

    builder.RegisterType<RequestInterception>();
    // 获取 Service.dll 程序集服务,并注册
    var assemblysServices = Assembly.LoadFrom(servicesDllFile);
    //支持属性注入依赖重复
    builder.RegisterAssemblyTypes(assemblysServices)
        .AsImplementedInterfaces()
        .InstancePerDependency()
        .EnableInterfaceInterceptors()
        .InterceptedBy(typeof(RequestInterception))
        .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

    // 获取 Repository.dll 程序集服务,并注册
    var assemblysRepository = Assembly.LoadFrom(repositoryDllFile);
    //支持属性注入依赖重复
    builder.RegisterAssemblyTypes(assemblysRepository)
        .AsImplementedInterfaces()
        .InstancePerDependency()
        //.EnableInterfaceInterceptors()
        //.InterceptedBy(aops.ToArray())//服务层的拦截器加一个即可 多个会造成重复拦截报错
        .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

    #endregion

}

}

2.配置Startup

在ConfigureServices和Configure新建ConfigureContainer
​​由于.net​​ core 是管道模型运行,所以ConfigureContainer会在ConfigureServices之后运行,在Configure之前运行
这个代码的含义是,在项目启动时会在创建ControllerBase子类,并且不是ControllerBase的控制器创建对象是开启依赖注入
public void ConfigureContainer(ContainerBuilder builder)
{
//获取所有控制器类型并使用属性注入
var controllerBaseType = typeof(ControllerBase);
builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
.PropertiesAutowired();
builder.RegisterModule(new AutofacModuleRegister());

}

3.基础使用

一般在配置上面设置后,在控制器中重写构造函数
如现有IUserService接口,以及他的实现UserService。

3.1通过构造函数注入

public class UserController : BaseApiController
{
private readonly IUserService service;
public UserController(IUserService service)
{
this.service = service;
}
}

3.2方法对象注入

public class UserController : BaseApiController
{
private readonly IUserService service;
public UserController()
{
this.service = AutofacUtil.GetService();
}
}其中AutofacUtil帮助方法
ILifetimeScope是Autofac内部对象,这个需要在Startup类的Configure方法中初始化
AutofacUtil.Container = app.ApplicationServices.GetAutofacRoot();public class AutofacUtil
{
public static ILifetimeScope Container { get; set; }

    /// <summary>
        /// 获取服务(Single)
        /// </summary>
        /// <typeparam name="T">接口类型</typeparam>
        /// <returns></returns>
    public static T GetService<T>()
    {
        return Container.Resolve<T>();
    }

    /// <summary>
        /// 获取服务(请求生命周期内)
        /// </summary>
        /// <typeparam name="T">接口类型</typeparam>
        /// <returns></returns>
    public static T GetScopeService<T>() where T : class
    {
        return (T)GetService<IHttpContextAccessor>().HttpContext.RequestServices.GetService(typeof(T));
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值