[英]Autofac - Resolve dependencies in WebApi controllers of seperate assemblies
我在Visual Studio解決方案中有兩個項目
ProjectA -Owin Selfhost Webapi應用程序
ProjectB-此處添加了類庫應用程序(參考ProjectA)WebApi控制器
該項目B控制器在項目A通過重寫DefaultAssembliesResolver作為解釋得到解決這里 。
ProjectA代碼:
//WebApi startup class
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.Services.Replace(typeof(IAssembliesResolver), new MyAssemblyResolver());
var builder = new ContainerBuilder();
var assemblies = GetExternalControllerAssemblier();
assemblies.Add(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(assemblies.ToArray());
//Builder reference is passed to external controllers and builder object is updated there
HandleExtControllerDependency(ref builder, assemblies);
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(config);
}
}
//I'm using reflection and calling a method in external assembly, to update `builder` object.
private void HandleExtControllerDependency(ref builder, List<Assembly> assemblies)
{
foreach (component in assemblies)
{
var type = assembly.GetType(component+"DependencyHandler");
IDependencyHandler handler = Activator.CreateInstance(type) as IDependencyHandler;
handler.LoadDependencies(ref builder);
}
}
項目B代碼:從ProjectA傳遞的builder
對象將在此處更新。
public class DependencyHandler : IDependencyHandler
{
public void LoadDependencies(ref ContainerBuilder builder)
{
builder.RegisterType<Demo>().As<IDemo>();
}
}
問題:
我有一個名為DemoController的控制器,並且有一個無參數的構造函數。 我期望AutoFac注入依賴項。 似乎在控制器中無法解決依賴關系。 我收到以下錯誤:
嘗試創建“ DemoController”類型的控制器時發生錯誤。 確保控制器具有無參數的公共構造函數。
題
1)我解決外部程序集依賴性的方法是否正確? 還有更好的選擇嗎?
2)我需要這個代碼嗎? builder.RegisterApiControllers(assemblies.ToArray());
3)如何解決此問題?
Autofac提供了一種簡單的機制來滿足我的要求。 我已經通過使用AutoFac程序集掃描解決了此問題。
1)創建一個類,並使用Module
類進行擴展,並覆蓋Load方法。 在Overridden方法中注冊依賴項。
public class AModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(c => new AComponent()).As<AComponent>();
}
}
public class BModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(c => new BComponent()).As<BComponent>();
}
}
2)在主應用程序中注冊模塊:
var assembly = typeof(AComponent).Assembly;
var builder = new ContainerBuilder();
// Registers both modules
builder.RegisterAssemblyModules(assembly);
注意:不要忘記通過調用注冊外部控制器
builder.RegisterApiControllers(<assembly array>);
而已。 編碼愉快!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.