0

到目前为止,我已经在我的 MVC 项目中的一个类中完成了类型注册,但我现在正在尝试使用模块来完成它。我的项目结构如下

Project.Data:包含我的实体框架类和 DataContext。我已经重构了我的 datacontect 以实现我通过 autofac 模块 Project.Business注册的接口(IDbContext) :包含注入 IDbContext 实例的业务逻辑类。类实现相应的接口,这些接口也通过 autofac 模块 Project.Web注册:asp.net 项目,它使用程序集扫描来注册所有 autofac 模块

示例代码

项目数据

//IDbContext
public  interface IDbContext
{
    IDbSet<MyData> MyDatas { get; set; }
    ....
}

//DataContext
public class DataContext : DbContext, IDbContext
{
    public IDbSet<MyData> MyDatas { get; set; }
}

//Module
public class DataInjectionModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<DataContext>().As<IDbContext>();
    }
}

项目.业务

public interface IServeDataService
{
    IEnumerable<object> GetData();
}
public class ServeDataService : IServeDataService
{
    private IDbContext context;
    public ServeDataService()
    {
        this.context = context;
    }
    public IEnumerable<object> GetData()
    {
    }
}

public class BusinessInjectionModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<ServeDataService>().As<IServeDataService>();
    }
}

项目网站

public partial class Startup
{
     public void RegisterContainer()
     {
         var builder = new ContainerBuilder();

         var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
         builder.RegisterAssemblyModules(assemblies.ToArray());
         builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

         builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

     }
}

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        RegisterContainer();
    }
}

//controller
public class DataController : ApiController
{
    private IServeDataService dataService;
    public DataController(IServeDataService dataService)
    {
        this.dataService = dataService;
    }

    public async Task<IHttpActionResult> Get()
    {
        var data = dataService.GetData();
        return Ok(data);
    }
}

但是,当我尝试调用 api 服务时,出现以下错误

尝试创建类型为“DataController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。

我已经在 RegisterContainer 方法中调试并设置了断点并被调用,我还查看了列出的程序集并列出了我的业务和数据程序集,但我的模块注册从未运行。我究竟做错了什么?

4

1 回答 1

0

您似乎没有将 Web API 配置为使用您的Autofac容器。

要将 Autofac 与 Web API 集成,您需要引用 Web API 集成 NuGet 包,注册控制器并设置依赖关系解析器。您也可以选择启用其他功能。
> Autofac-Web API 文档

为了使其工作,您必须在Autofac ASP.NET Web API 集成RegisterContainernuget 包上添加一个引用,并在您的方法中添加以下行:

// Set the dependency resolver to be Autofac.
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
于 2015-07-30T13:09:38.133 回答