クラスを 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();
}