我在MVC Web应用程序中使用了Ninject,没有注入业务逻辑类的任何问题。但我想将数据访问类注入业务逻辑类的构造函数。逻辑层是一个类库,没有Program.cs类或入口点。
public class DataAccessClass
{
public void Insert(Product product)
{
new SqlObj().Insert(Product);
}
}
public Interface IDataAccessClass()
{
void Insert(Product product);
}
public class ProductLogic()
{
IDataAccessClass _dataAccessClass;
//DataAccessClass should be injected here using Ninject
public ProductLogic(IDataAccessClass dataAccessClass)
{
_dataAccessClass=dataAccessClass;
}
public InsertProduct(Product product)
{
_dataAccessClass.Insert(product);
}
}
这就是我需要的 我有一个3层应用程序,层是:
因此Web
图层对DAL
图层一无所知。我在DAL
中有了存储库接口和具体类,它们在业务逻辑类的BLL
层中使用。问题是,为了解耦DAL
和BLL
,如何设置Ninject以将我的存储库实现注入BLL
层?
答案 0 :(得分:3)
使用Nuget安装NInject
Install-Package Ninject
您可以创建一个注册对象的方法。您需要注册创建对象所需的所有依赖项。
public static void Register(IKernel kernel)
{
kernel.Bind<IDataAccessClass>().To<DataAccessClass>();
kernel.Bind<ProductLogic>().ToSelf();
}
创建StandardKernel
的新实例并调用Register
来注册对象。
要获取对象的实例,您可以简单地调用Get<>
方法,然后您将获得该对象的新内容。还有其他方法。
static void Main(string[] args)
{
var kernel = new StandardKernel();
Register(kernel); // register the objects
var productLogic = kernel.Get<ProductLogic>(); // create instance
}
要解决只有BLL
看到DAL
的问题,您可以在其中添加新项目(类库),然后安装NInject并创建Register
方法。您可以在Web
项目中引用此类库并注册实体。
物件
public class Product
{
}
public class DataAccessClass : IDataAccessClass
{
public void Insert(Product product)
{
}
}
public interface IDataAccessClass
{
void Insert(Product product);
}
public class ProductLogic
{
IDataAccessClass _dataAccessClass;
//DataAccessClass should be injected here using Ninject
public ProductLogic(IDataAccessClass dataAccessClass)
{
_dataAccessClass = dataAccessClass;
}
public void InsertProduct(Product product)
{
_dataAccessClass.Insert(product);
}
}
答案 1 :(得分:0)
我刚刚看过这篇文章,并与原始海报有相同的潜在误解,直到我了解:
类库就是库。它们不控制依赖项的注入。即使在那些注入仅在类库中,也可以在使用这些库的任何应用程序中配置DI(无论是控制台,ASP.NET,WPF,WinForms还是其他)。
将核心模型和实体框架(使用工作单元)移动到单独的类库中以供重用时,遇到了这个问题。我花了几个小时试图弄清楚该类库如何配置其DI,最后还是MVC Web应用程序引用了需要处理它的类库。
换句话说,在我的实际应用程序的引导程序中,我需要绑定引用的类库中使用的接口/具体类。