繁体   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