2016-07-29 30 views
0

現狀如何在autofac的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(); 

什麼,我試圖

我想用RegisterGeneric()如下:

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