[英]Confused in Dependency Injection
我是MVC和依賴注入的新手。 請幫助我理解它應該如何工作。 我用Ninject。 這是我的代碼:
在Global.asax文件中:
private void RegisterDependencyResolver()
{
var kernel = new StandardKernel();
kernel.Bind<IDbAccessLayer>().To<DAL>();
// DAL - is a Data Access Layer that comes from separated class library
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}
protected void Application_Start()
{
RegisterDependencyResolver();
}
IDbAccessLayer實現非常簡單:
public interface IDbAccessLayer
{
DataContext Data { get; }
IEnumerable<User> GetUsers();
}
現在在Controller中我需要創建一個獲取IDbAccessLayer參數的構造函數。 這才有效。
現在我不知道如何將連接字符串傳遞給DAL。 如果我嘗試用接受參數的東西替換DAL的構造函數,它就不起作用。 使用消息引發異常沒有為此對象定義無參數構造函數
您可以指定構造函數參數:
kernel
.Bind<IDbAccessLayer>()
.To<DAL>()
.WithConstructorArgument("connectionString", "YOUR CONNECTION STRING HERE");
而不是在Global.asax
對連接字符串進行硬編碼,您可以使用以下命令從web.config中讀取它:
ConfigurationManager.ConnectionStrings["CNName"].ConnectionString
現在您的DAL類可以將連接字符串作為參數:
public class DAL: IDbAccessLayer
{
private readonly string _connectionString;
public DAL(string connectionString)
{
_connectionString = connectionString;
}
... implementation of the IDbAccessLayer methods
}
創建一個無參數構造函數,使用默認連接字符串調用單參數構造函數。
public DAL() : this("default connection string") {
}
public DAL(string connectionString) {
// do something with connection string
}
我沒有和ninject一起工作,只是和Unity一點。 但是所有的IOC容器似乎都傾向於你制作自己的工廠類,它接受你的有狀態參數(你的連接字符串),它返回你的真實對象。 例如,如果你有一個Person類,它需要構造函數的“name”和“age”,那么你必須建立一個與Unity交互的工廠,就像這樣:
IPerson foo = container.Resolve<IPersonFactory>().Create("George", 25);
這是我不喜歡的IOC容器之一,但它通常在哪里...
只是愚蠢的想法,不知道ninject:
kernel.Bind<IMyConnectionString>().To<MyConnectionString>();
並接受您的DAL構造函數接受IMyConnectionString
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.