依赖注入让我感到困惑

3

我是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();
}

现在我需要在控制器中创建一个构造函数,该函数需要获取IDbAccessLayer参数,并且能够正常工作。

但是我不知道如何将连接字符串传递给DAL。如果我尝试用接受参数的内容替换DAL的构造函数,它无法工作。会抛出异常信息未为此对象定义无参构造函数

4个回答

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
}

是的...那正是我需要的东西。谢谢,谢谢,谢谢! - iLemming

1
创建一个无参数构造函数,该构造函数使用默认连接字符串调用一个参数构造函数。
public DAL() : this("default connection string") {

}

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

0

我没有使用过Ninject,只是稍微用了一下Unity。但所有的IOC容器似乎都倾向于让你自己创建一个工厂类,该类接受你的有状态参数(例如连接字符串),并返回你的真实对象。例如,如果你有一个需要构造函数中的“姓名”和“年龄”的Person类,则必须创建一个工厂类,该工厂类将与Unity交互,就像这样:

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

这是我不喜欢IOC容器的一件事情,但通常就是它的应用场合...


0

只是一个没有关于Ninject知识的愚蠢想法:

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

并且针对接受IMyConnectionString的DAL构造函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接