3

クラスを autofac に登録しようとすると、「インスタンス登録 'GetAllDivisionsCommand' は SingleInstance() 共有のみをサポートできます」というエラーが表示されます。

このエラーが発生する理由はわかりませんが、このクラスの唯一の違いはキャッシュに使用される静的メンバー変数を持つクラスに関係していると考えられます。他のクラスを SingleInstance または InstancePerDependency として登録する際に問題はありませんでした。

基本的に、このクラスはデータベースからめったに変更されない部門のリストを取得し、結果をキャッシュするために使用されます。コマンドが実行されるたびに、最初にデータベースの変更がチェックされ、変更が検出された場合はクエリが再実行されます。そうでない場合は、キャッシュされたリストを返します。

そのため、GetAllDivisionsCommand を Autofac に IGetAllDivisionsCommand として登録しようとしています。IGetAllDivisionsCommand 自体は、単なるマーカー インターフェイスである IInjectableCommand と ICachedListCommand を実装しています。具体的なコマンド クラスは、静的メンバー変数が存在する抽象基本クラス CachedListCommand から継承します。

このエラーメッセージの原因を知っている人はいますか? 同じセッションを再利用し続けることができないため、SingleInstance は機能しません。

コード:

Type commandType = typeof(IInjectedCommand);
        Type aCommandType = typeof(GetAllDivisions);

        var commands =
            from t in aCommandType.Assembly.GetExportedTypes()
            where t.Namespace == aCommandType.Namespace
                  && t.IsClass
                  && !t.IsAbstract
                  && (commandType.IsAssignableFrom(t))
            let iface = t.GetInterfaces().FirstOrDefault(x => "I" + t.Name == x.Name)
            select new { Command = t, Interface = iface };

        foreach (var cmd in commands)
        {
            builder.RegisterInstance(cmd.Command).As(cmd.Interface).InstancePerLifetimeScope();
        }
4

2 に答える 2

6

RegisterInstace名前が示すように、型ではなくインスタンスを登録するためのものです。

必要なものは次のRegisterTypeとおりです。

foreach (var cmd in commands)
{
    builder.RegisterType(cmd.Command).As(cmd.Interface).InstancePerLifetimeScope();
}

ところで、Autofac スキャン機能を使用すると、登録コードはほぼ同じになります。

builder
    .RegisterAssemblyTypes(aCommandType.Assembly)
    .AssignableTo<IInjectedCommand>()
    .InNamespace(aCommandType.Namespace)
    .AsImplementedInterfaces()
    .InstancePerLifetimeScope();
于 2013-02-28T13:59:35.850 に答える