0

これまで、MVC プロジェクト内のクラス内で型登録を行ってきましたが、モジュールでそれを実行しようとしています。私のプロジェクトは次のように構成されています

Project.Data : 私のエンティティ フレームワーク クラスと DataContext が含まれています。autofac モジュールProject.Businessを介して登録するインターフェイス (IDbContext) を実装するように datacontect をリファクタリングし ました。IDbContext インスタンスが挿入されるビジネス ロジック クラスが含まれています。クラスは、autofac モジュール Project.Webを介して登録される対応するインターフェイスを実装します: アセンブリ スキャンを使用してすべての autofac モジュールを登録する asp.net プロジェクト

サンプルコード

プロジェクト.データ

//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>();
    }
}

プロジェクト.Web

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

Autofacコンテナーを使用するように Web API を構成していないようです。

Autofac を Web API と統合するには、Web API 統合 NuGet パッケージを参照し、コントローラーを登録し、依存関係リゾルバーを設定する必要があります。オプションで、他の機能も有効にすることができます。
> Autofac - Web API ドキュメント.

機能させるには、Autofac ASP.NET Web API Integration nuget パッケージに参照を追加し、RegisterContainerメソッドに次の行を追加する必要があります。

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