簡體   English   中英

Autofac-解決單獨程序集的WebApi控制器中的依賴項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM