62,242
社区成员




//containerBuilder是autofac注入容器
//RedisHelper是一个普通的类,中有get和set方法操作数据库。
//在Startup.cs中注入对象
containerBuilder.RegisterInstance(new RedisHelper(0,"192.168.99.100:6379","api")).Keyed<RedisHelper>("apiredis");
public class ValuesController : BaseController
{
private readonly RedisHelper _redisHelper;
public ValuesController([KeyFilter("apiredis")]RedisHelper redisHelper)
{
//为什么不行?
_redisHelper = redisHelper;
}
}
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;
}
}
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();
builder.RegisterType<RedisLib>()
.Keyed<IRedisLib>("RedisCache")
.SingleInstance();
构造中取不到:
public TestService([KeyFilter("Redis")]IRedisLib redis)
{
...
}
ResolveKeyed可以:
ApplicationContainer.ResolveKeyed<IRedisLib>("RedisCache");
containerBuilder.RegisterInstance(new RedisHelper(0,"192.168.99.100:6379","api")).As<RedisHelper>().Keyed<RedisHelper>("apiredis");
加上As就可以了services.AddMvc().AddControllersAsServices();