1

DevExpressのサンプルMVCWebサイトアプリケーションがあります。CastleWindsorをIOCとして使用します。Autofac経由で交換しようとしましたが、うまくいきませんでした。

サンプルコードは次のとおりです。

container
    .Register(Component
        .For<DbRepositories.ClinicalStudyContext>()
        .LifestylePerWebRequest()
        .DependsOn(new { connectionString }))
    .Register(Component
        .For<DbRepositories.IClinicalStudyContextFactory>()
        .AsFactory())
    .Register(Component
        .For<FirstStartInitializer>()
        .LifestyleTransient())
    .Register(Component
        .For<IUserRepository>()
        .ImplementedBy<DbRepositories.UserRepository>())

これが私のAutofac変換です:

var builder = new ContainerBuilder();

builder.RegisterControllers(typeof(MvcApplication).Assembly);

builder.Register(c => 
    new DbRepositories.AdminContext(connectionString))
    .InstancePerHttpRequest();

builder.RegisterType<DbRepositories.IAdminContextFactory>()
    .As<DbRepositories.IAdminContextFactory>();

builder.RegisterType<DbRepositories.UserRepository>()
    .As<IUserRepository>().InstancePerHttpRequest();

私の研究に関しては、AutofacにAsFactory()の実装はありません。

これはIAdminContextFactoryインターフェースです:

public interface IAdminContextFactory
{
    AdminContext Retrieve();
}

これは、アプリケーションが言うエラーです。

タイプ'Admin.Infrastructure.EFRepository.IAdminContextFactory'のコンストラクターは、'パブリックバインディングフラグ'では見つかりません。

誰か助けてもらえますか?

ありがとう。

4

1 に答える 1

3

mustの最初の部分はサービスタイプIAdminContextFactoryである必要があるため、登録は失敗します。RegisterTypeこの場合、インターフェースを実装するクラス。IAdminContextFactoryAutofacはそのタイプのインスタンスを構築しようとしますが、インターフェースをインスタンス化できないため、これは確かに失敗します。

したがって、必要なのはインターフェイスの実装です。IAdminContextFactoryCastleAsFactoryメソッドは、この実装を生成します。Autofac AggregateService extraを使用すると、この動作を実現できます。

ビットを配置すると、次のことができます。

builder.RegisterAggregateService<IAdminContextFactory>();
于 2012-12-11T08:55:30.593 に答える