雖然自動找到連接的無參數構造函數看起來是個不錯的主意,但它將對象上下文緊密地耦合到配置文件。
它還引入了一些「魔術」,因爲消費者沒有明確的方法來確定如何更改與無參數構造函數關聯的連接字符串(除了讀取源代碼)。
我想我的答案是,無論實體框架是否允許你這樣做,你可能不應該這樣做。使用一個工廠,而是和達到同樣的靈活性,而搭售的對象上下文來配置系統:
public interface ICustomDataContextFactory
{
CustomDataContext Create();
}
public class CustomDataContextFactory : ICustomDataContextFactory
{
private readonly string _connectionStringName;
public CustomDataContextFactory(string connectionStringName)
{
_connectionStringName = connectionStringName;
}
public CustomDataContext Create()
{
var connectionString = ConfigurationManager.ConnectionStrings[_connectionStringName].ConnectionString;
return new CustomDataContext(connectionString);
}
}
這爲所有消費者創造一個無參數實例相同的機制,同時允許實現者決定如何實例被創建 - 可能需要爲特定實例使用不同的連接字符串,或者在啓動時從命令行讀取數據庫名稱。
我意識到你說你不想引入一個傳遞連接字符串的新類。我認爲這是一個來自CustomDataContext
而不是工廠的類,這是一個新概念。
(這個答案只適用於生產代碼。無參數構造函數技巧在短時代碼中很有用,如概念驗證。)