簡體   English   中英

在依賴注入中感到困惑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM