AutofaC语言 解析单独程序集的 WebApi 控制器中的依赖项



我在可视化工作室解决方案中有两个项目

项目A- 欧文自托管Webapi应用程序

项目B- 此处添加了类库应用程序(参考项目A)WebAPI 控制器

ProjectB 控制器在项目 A 中通过重写 DefaultAssembliesResolver 进行解析,如此处所述。

项目代码:

//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 代码:从项目A 传递的builder对象将在此处更新。

public class DependencyHandler : IDependencyHandler
{
public void LoadDependencies(ref ContainerBuilder builder)
{
builder.RegisterType<Demo>().As<IDemo>();
}
}

问题:

我有一个名为DemoController的控制器,并且有一个无参数构造函数。我希望 AutoFac 注入依赖项。似乎在控制器中未解决依赖项。我收到以下错误:

尝试创建类型的控制器时出错 "演示控制器"。确保控制器具有无参数 公共构造函数。

问题

1) 我解决外部程序集中依赖关系的方法是否正确?有没有更好的选择?

2) 我应该需要这个代码吗?builder.RegisterApiControllers(assemblies.ToArray());

3) 如何解决这个问题?

> Autofac 提供了一种简单的机制来满足我的要求。我已经通过使用AutoFac程序集扫描解决了这个问题。

1) 创建一个类并使用Module类进行扩展并覆盖 Load 方法。在重写方法中注册依赖项。

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>);

就是这样。祝您编码愉快!

最新更新