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