web-dev-qa-db-ja.com

汎用インターフェースのすべての実装をautofacに登録する方法は?

エンティティをマップしてモデルを後方にマップすることを想定した汎用インターフェースを作成しました。 autofac構成で約80の登録を行う必要があります。一括登録はできますか?これがインターフェースです:

public interface ICommonMapper<TEntity, TModel, TKey>
    where TEntity : BaseEntity<TKey>
    where TModel : BaseEntityViewModel<TKey>
    where TKey : struct 
{
    TModel MapEntityToModel(TEntity entity);
    TModel MapEntityToModel(TEntity entity, TModel model);
    TEntity MapModelToEntity(TModel model);
    TEntity MapModelToEntity(TModel model, TEntity entity);
}

ありがとう!

15
Roman

あなたが使うことができます:

builder.RegisterAssemblyTypes(assemblies)
       .AsClosedTypesOf(typeof(ICommonMapper<,,>));

ここで、assembliesは、タイプが属するアセンブリのコレクションです。

ICommonMapper<Person, PersonModel, Int32>から継承するPersonMapperがある場合、AutofacICommonMapper<Person, PersonModel, Int32>を解決できます

27
Cyril Durand

複雑にする必要はありません。以下のように、インターフェイスのすべての実装を通常どおりに登録するだけです。

enter image description here

次に、Autofacは、このようなコンストラクターでインターフェースの列挙可能/配列を検出すると、そのインターフェースの実装を自動的に挿入します。 enter image description here

私はこの方法を使用しましたが、期待どおりに機能します。それが役に立てば幸い。乾杯

5
Hung Vu

これを行う別の方法がありますが、typeFinderを使用します。

var mappers = typeFinder.FindClassesOfType(typeof(ICommonMapper<,,>)).ToList();
        foreach (var mapper in mappers)
        {
            builder.RegisterType(mapper)
                .As(mapper.FindInterfaces((type, criteria) =>
                {
                    var isMatch = type.IsGenericType &&
                                  ((Type)criteria).IsAssignableFrom(type.GetGenericTypeDefinition());
                    return isMatch;
                }, typeof(ICommonMapper<,,>)))
                .InstancePerLifetimeScope();
        }
0
Roman