我試圖用Autofac IRegistrationSource
解決其他接口,但它不工作。下面是我的代碼:Autofac,MakeGenericMethod.Invoke不能正常工作
public class SettingsSource : IRegistrationSource
{
static readonly MethodInfo BuildMethod = typeof(SettingsSource).GetMethod(
"BuildRegistration",
BindingFlags.Static | BindingFlags.NonPublic);
public IEnumerable<IComponentRegistration> RegistrationsFor(
Service service,
Func<Service, IEnumerable<IComponentRegistration>> registrations)
{
var ts = service as TypedService;
if (ts != null && typeof(ISettings).IsAssignableFrom(ts.ServiceType))
{
var buildMethod = BuildMethod.MakeGenericMethod(ts.ServiceType);
yield return (IComponentRegistration)buildMethod.Invoke(null, null);
}
}
static IComponentRegistration BuildRegistration<TSettings>()
where TSettings : ISettings, new()
{
return RegistrationBuilder
.ForDelegate((c, p) =>
{
return c.Resolve<ISettingService>().LoadSetting<TSettings>();
})
.InstancePerLifetimeScope()
.CreateRegistration();
}
public bool IsAdapterForIndividualComponents { get { return false; } }
}
私有方法c.Resolve()LoadSetting()不能被解僱。
我檢查了波紋管的鏈接,仍然無法弄清楚爲什麼。 Autofac. How to use custom method(property) to resolve some interface?
http://nblumhardt.com/2010/01/declarative-context-adapters-autofac2/
誰能給一個線索?
感謝
您提供的代碼是nopcommerce中設置提供程序註冊的逐字副本。因此,您可以確保它按預期工作,否則根本無法訪問設置。你想做什麼? –
感謝馬可,是的,它來自nopcommerce。我想實現像nopcommerce這樣的系統設置框架。所有由ISettingService運行並在系統啓動時註冊的設置。但我發現fordelegate中的私有函數沒有被解僱。 – LLI
您是否註冊了註冊資源?首先需要調試RegistrationsFor方法以確保它被調用,並在解析繼承ISettings的類時執行yield return子句。有需要設置斷點的地方。 –