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;
}
}
希望有人告知?
uj5u.com熱心網友回復:
注入是發生在 類構造完畢 建構式執行完畢才相當于構造了這個類 所以在建構式中 物件是空的uj5u.com熱心網友回復:
Startup中AddMvc()后面加上AddControllersAsServices():services.AddMvc().AddControllersAsServices();
uj5u.com熱心網友回復:
另外問一下,你在service層構造方法中卻可以通過[KeyFilter]獲取指定鍵的注入物件, 用的是asp.net core 還是asp.net?uj5u.com熱心網友回復:
asp.net coreuj5u.com熱心網友回復:
我測驗了,還是不行,不知道大佬實踐了嗎
uj5u.com熱心網友回復:
containerBuilder.RegisterInstance(new RedisHelper(0,"192.168.99.100:6379","api")).As<RedisHelper>().Keyed<RedisHelper>("apiredis");加上As就可以了
uj5u.com熱心網友回復:
不對,加上As后KeyFilter不起作用了uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
@小黑劉顏, 著重看一下這段:https://autofaccn.readthedocs.io/en/latest/integration/aspnetcore.html#controllers-as-services
uj5u.com熱心網友回復:
我現在遇到的問題是Keyed注冊后通過ApplicationContainer.ResolveKeyed<IRedisLib>("RedisCache");可以獲取,但構建函式中不行:注冊:
builder.RegisterType<RedisLib>()
.Keyed<IRedisLib>("RedisCache")
.SingleInstance();
構造中取不到:
public TestService([KeyFilter("Redis")]IRedisLib redis)
{
...
}
ResolveKeyed可以:
ApplicationContainer.ResolveKeyed<IRedisLib>("RedisCache");
uj5u.com熱心網友回復:
忽略上面構造中的Key不匹配,匹配了也取不到uj5u.com熱心網友回復:


總有很多奇怪的情況,我也是兩眼發愣。
uj5u.com熱心網友回復:
我的問題解決了, 我是在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();
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/126066.html
標籤:ASP.NET
