2016-07-29 7 views
0

現状autofacのRegisterGeneric()メソッドで動的パラメータを使用するにはどうすればよいですか?

私は、次のパターンを持つすべての、いくつかのクラス、一つ一つを登録しています:私はRegisterGeneric()を使用したい

をしようとしています何

builder.RegisterType<NpgsqlDapperRepository<Foo, int>>() 
       .As<IDapperRepository<Foo, int>>() 
       .WithParameter(new NamedParameter("connectionString", ConnectionString)) 
       .WithParameter(new NamedParameter("tableName", "Foos")) 
       .WithParameter(new NamedParameter("schema", "dbo")) 
       .InstancePerLifetimeScope(); 

次のようになります。

builder.RegisterGeneric(typeof(NpgsqlDapperRepository<,>)) 
       .As(typeof(IDapperRepository<,>)) 
       .WithParameter(new NamedParameter("connectionString", ConnectionString)) 
       .WithParameter(new NamedParameter("tableName", ???)) //TODO: Determine table name from entity type (acquire from dictionary or something). How do I acquire the type? 
       .WithParameter(new NamedParameter("schema", "dbo")) 
       .InstancePerLifetimeScope(); 

明らかに、これは、本質的に全く同じ構成を持つ100個のエンティティを登録する必要はなく、ただ1つのパラメータが異なるだけです。

私はエンティティタイプからテーブル名を決定する必要が

問題。 RegisterGeneric()を使用しているときにタイプを取得するにはどうすればよいですか?これも可能ですか?

エクストラノート

私はResolvedParameterと呼ばれるものに気づき、それに見えたが、私はそれは私が必要なものだかはわかりません。私は考えていない。しかし、それが本当に必要なものであれば、私の状況の例が分かります。

+0

'log4net'ロガー解決コードを見てみましょう、あなたが望むものに似ているようです。あなたの使用のためにそれを適応させることができるかどうかを見てください... http://docs.autofac.org/en/latest/examples/log4net.html – Aron

答えて

2

あなたが作成することができ、独自のParameter

public class TableNameParameter : Parameter 
{ 
    public override Boolean CanSupplyValue(
     ParameterInfo pi, IComponentContext context, out Func<Object> valueProvider) 
    { 
     valueProvider = null; 

     if (pi.ParameterType != typeof(String) && pi.Name != "tableName") 
      return false; 

     valueProvider =() => 
     { 
      ITableNameResolver tableNameResolver = context.Resolve<ITableNameResolver>(); 
      Type entityType = pi.Member.DeclaringType.GetGenericArguments()[0]; 
      String tableName = tableNameResolver.GetTableName(entityType); 
      return tableName; 
     }; 
     return true; 
    } 
} 
+0

パーフェクト!ありがとうございました! – Matt

関連する問題