如何在c#类库中使用Ninject
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在c#类库中使用Ninject相关的知识,希望对你有一定的参考价值。
我在MVC Web应用程序中使用了Ninject,没有注入业务逻辑类的任何问题。但我想将数据访问类注入业务逻辑类的构造函数。逻辑层是一个类库,没有Program.cs类或入口点。
Data access class
public class DataAccessClass
{
public void Insert(Product product)
{
new SqlObj().Insert(Product);
}
}
Data access class interface
public Interface IDataAccessClass()
{
void Insert(Product product);
}
Business logic class
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:表示层(ASP.NET MVC) - >只看到BLL
- BLL:业务逻辑层 - >只能看到DAL
- DAL:数据访问层
所以Web
层对我的DAL
层一无所知。我在DAL
中有存储库接口和具体类,它们在业务逻辑类的BLL
层中使用。问题是,为了解耦DAL
和BLL
,如何设置Ninject将我的存储库实现注入BLL
层?
使用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);
}
}
我刚刚遇到这篇文章并且与原始海报有同样的潜在误解,直到我理解为止:
类库就是库,库。它们不控制依赖项的注入。 DI被配置在任何应用程序使用这些库(无论是控制台,ASP.NET,WPF,WinForms或其他),即使这些注入仅在类库中。
当我将核心模型和实体框架(使用工作单元)移动到一个单独的类库中以便重用时,我遇到了这个问题。我花了几个小时试图弄清楚该类库如何配置它的DI,最后它是MVC Web应用程序引用需要处理它的类库。
换句话说,在我的实际应用程序的引导程序中,我需要绑定在我引用的类库中使用的接口/具体类。
以上是关于如何在c#类库中使用Ninject的主要内容,如果未能解决你的问题,请参考以下文章