AutoFac注入框架,无法在控制器构造方法中获取注入对象

*八步赶蝉* 2019-07-25 04:55:28
AutoFac注入框架
注入实体对象时用到了用于检索组件的键以区分不同的注入对象,可无法在控制器构造方法中用[KeyFilter]获取指定键的注入对象,但可以通过controller调用service层代码,在service层构造方法中却可以通过[KeyFilter]获取指定键的注入对象,这是为什么?

Startup.cs中部分代码如下:

//containerBuilder是autofac注入容器
//RedisHelper是一个普通的类,中有get和set方法操作数据库。
//在Startup.cs中注入对象
containerBuilder.RegisterInstance(new RedisHelper(0,"192.168.99.100:6379","api")).Keyed<RedisHelper>("apiredis");


在contraoller中却无法这样获取注入对象。

public class ValuesController : BaseController
{
private readonly RedisHelper _redisHelper;

public ValuesController([KeyFilter("apiredis")]RedisHelper redisHelper)
{
//为什么不行?
_redisHelper = redisHelper;
}
}


下面通过一个service层却可以.

public class ValuesController : BaseController
{
private readonly IValueService _valueServer;

public ValuesController(
IValueService valueService)
{
_valueServer = valueService;
}
}

public class ValueService : IValueService
{
private readonly RedisHelper _redisHelper;
public ValueService([KeyFilter("apiredis")]RedisHelper redisHelper)
{
//这样却可以为什么?
_redisHelper = redisHelper;
}
}


希望有人告知?

...全文
366 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylhyh 2019-08-19
引用 12 楼 敲哭 的回复:
总有很多奇怪的情况,我也是两眼发愣。
我的问题解决了, 我是在web api的ValuesController的构造函数中通过KeyFilter获取实例.

    public interface ISay
    {
        string Say();
    }

    public class Foobar : ISay
    {
        public Foobar(string name)
        {
            Name = name;
        }

        public string Name { get; private set; }

        public string Say()
        {
            return $"My name is {Name}";
        }
    }

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().AddControllersAsServices();

            var builder = new ContainerBuilder();
            builder.Populate(services);
            builder.RegisterType<Foobar>().UsingConstructor(typeof(string)).WithParameter("name", "Eric").Named<ISay>("Eric").SingleInstance();
            builder.RegisterType<Foobar>().UsingConstructor(typeof(string)).WithParameter("name", "Fred").Keyed<ISay>("Fred").SingleInstance();

            builder.RegisterType<ValuesController>().AsSelf().WithAttributeFiltering();

            var container = builder.Build();

            return container.Resolve<IServiceProvider>();
        }

        private readonly ISay fb1;
        private readonly ISay fb2;

        public ValuesController([KeyFilter("Eric")]ISay fbEric, [KeyFilter("Fred")]ISay fbFred)
        {
            fb1 = fbEric;
            fb2 = fbFred;
        }
1. ConfigureServices方法中AddMvc的时间要调用AddControllersAsServices:
services.AddMvc().AddControllersAsServices();
2. 要在ConfigureServices中注册ValuesController, 并调用WithAttributeFiltering:
builder.RegisterType<ValuesController>().AsSelf().WithAttributeFiltering();
  • 打赏
  • 举报
回复
ylhyh 2019-08-01
忽略上面构造中的Key不匹配,匹配了也取不到
  • 打赏
  • 举报
回复
ylhyh 2019-08-01
我现在遇到的问题是Keyed注册后通过ApplicationContainer.ResolveKeyed<IRedisLib>("RedisCache");可以获取,但构建函数中不行: 注册:
builder.RegisterType<RedisLib>()
                .Keyed<IRedisLib>("RedisCache")
                .SingleInstance();
构造中取不到:

        public TestService([KeyFilter("Redis")]IRedisLib redis)
        {
            ...
        }
ResolveKeyed可以:
ApplicationContainer.ResolveKeyed<IRedisLib>("RedisCache");
  • 打赏
  • 举报
回复
ylhyh 2019-08-01
@小黑刘颜, 着重看一下这段: https://autofaccn.readthedocs.io/en/latest/integration/aspnetcore.html#controllers-as-services
  • 打赏
  • 举报
回复
*八步赶蝉* 2019-08-01
总有很多奇怪的情况,我也是两眼发愣。
  • 打赏
  • 举报
回复
*八步赶蝉* 2019-07-31
  • 打赏
  • 举报
回复
不对,加上As后KeyFilter不起作用了
  • 打赏
  • 举报
回复
containerBuilder.RegisterInstance(new RedisHelper(0,"192.168.99.100:6379","api")).As<RedisHelper>().Keyed<RedisHelper>("apiredis");
加上As就可以了
  • 打赏
  • 举报
回复
*八步赶蝉* 2019-07-30
引用 2 楼 ylhyh 的回复:
Startup中AddMvc()后面加上AddControllersAsServices():
services.AddMvc().AddControllersAsServices();
我测试了,还是不行,不知道大佬实践了吗
  • 打赏
  • 举报
回复
*八步赶蝉* 2019-07-30
asp.net core
  • 打赏
  • 举报
回复
ylhyh 2019-07-30
另外问一下,你在service层构造方法中却可以通过[KeyFilter]获取指定键的注入对象, 用的是asp.net core 还是asp.net?
  • 打赏
  • 举报
回复
ylhyh 2019-07-30
Startup中AddMvc()后面加上AddControllersAsServices():
services.AddMvc().AddControllersAsServices();
  • 打赏
  • 举报
回复
冰川711 2019-07-27
注入是发生在 类构造完毕 构造函数执行完毕才相当于构造了这个类 所以在构造函数中 对象是空的
  • 打赏
  • 举报
回复
相关推荐
发帖
.NET社区
加入

6.0w+

社区成员

.NET技术交流专区
社区管理员
  • ASP.NET
  • R小R
  • 喵叔哟
帖子事件
创建了帖子
2019-07-25 04:55
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。