2012-09-03 51 views
8

我在項目中使用Ninject作爲IoC容器。我有以下類:基於約定的構造函數字符串參數與Ninject的綁定

public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(string someDatabaseConnectionString) 
    { 
     // some code here.. 
    } 
} 

在我的應用程序設置文件中我有連接字符串名爲「someDatabase」。默認情況下,應該以注入此連接字符串到構造函數中添加以下配置:

kernel.Bind<ISomeRepository>() 
    .To<SomeRepository>() 
    .WithConstructorArgument("someDatabaseConnectionString", connString); 

,但我想實現這樣的字符串的常規基結合。名稱以「ConnectionString」結尾的字符串類型的所有構造函數參數的值應該從應用程序的connectionStrings配置節中取出並自動注入。我也想爲appSettings部分實現類似的約定。這種方法在Mark Seeman的"Primitive Dependencies"文章(「原語的約定」部分)中有更詳細的描述。示例中使用了Castle Windsor容器。

是否可以使用Ninject來實現這樣的約定,以及最好的方法是什麼?我已經嘗試ninject.extensions.conventions,但似乎它沒有這樣的功能,是嗎?

+0

你可以使用ConfigurationManager.AppSettings [「someDatabaseConnectionString」]? – Ben

+0

當前我正在使用ConfigurationManager.AppSettings [「someDatabaseConnectionString」]。但是想象一下,你有20個或更多的依賴於連接字符串的類。我不想爲每個這些類寫特定的規則,我想自動注入依賴關係。 –

回答

1

現在看起來Ninject並不是那種基於約定的綁定。 I had a similar question here,建議做一個接口來返回連接字符串並將其作爲參數。儘管如此,對於許多不同的連接字符串來說可能會很乏味。

這只是一個想法,但你可以有一個IConnectionStringProvider<T> 可以使用反射來獲取T的名稱和查找應用程序設置的方式?也許是這樣的:

public class ConnectionStringProvider<T> : IConnectionStringProvider<T> 
{ 
    public string Value 
    { 
     // use reflection to get name of T 
     // look up connection string based on the name 
     // return the connection string 
    } 
} 
... 
public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(IConnectionStringProvider<SomeRepository> connectionStringProvider) 
    { 
     this.connectionString = connectionStringProvider.Value; 
    } 
} 

此外,如果不工作,你可以有一個非通用IConnectionStringProvider接受一個類型作爲參數:

public class ConnectionStringProvider : IConnectionStringProvider 
{ 
    public string GetValueFor(Type type) 
    { 
     // use reflection to get name of type 
     // look up connection string based on the name 
     // return the connection string 
    } 
} 
... 
public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(IConnectionStringProvider connectionStringProvider) 
    { 
     this.connectionString = connectionStringProvider.GetValueFor(this.GetType()); 
    } 
} 

如果那麼這些作品之一,他們會具有可以與任何DI容器一起工作的優點。