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