在依赖注入中感到困惑

时间:2011-03-07 17:07:44

标签: c# asp.net-mvc-3 dependency-injection ninject

我是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的构造函数,它就不起作用。使用消息为此对象定义的无参数构造函数

引发异常

4 个答案:

答案 0 :(得分:5)

您可以指定构造函数参数:

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
}

答案 1 :(得分:1)

创建一个无参数构造函数,该构造函数使用默认连接字符串调用单参数构造函数。

public DAL() : this("default connection string") {

}

public DAL(string connectionString) {
    // do something with connection string
}

答案 2 :(得分:0)

我没有和ninject一起工作,只是和Unity一起工作过。但是所有的IOC容器似乎都倾向于你制作自己的工厂类,它接受你的有状态参数(你的连接字符串),它返回你的真实对象。例如,如果你有一个Person类,它需要构造函数的“name”和“age”,那么你必须建立一个与Unity交互的工厂,就像这样:

IPerson foo = container.Resolve<IPersonFactory>().Create("George", 25);

这是我对IOC容器不喜欢的事情之一,但它通常在哪里......

答案 3 :(得分:0)

不知道ninject的愚蠢想法:

kernel.Bind<IMyConnectionString>().To<MyConnectionString>();

接受IMyConnectionString

的DAL构造函数