如何在 c# class 库中使用 Ninject
How to use Ninject inside a c# class library
我已经在 MVC Web 应用程序中使用 Ninject 注入业务逻辑 classes 没有任何问题。但是我想将数据访问 classes 注入到业务逻辑 classes 的构造函数中。逻辑层是一个 class 库,没有 Program.cs class 或入口点。
数据访问class
public class DataAccessClass
{
public void Insert(Product product)
{
new SqlObj().Insert(Product);
}
}
数据访问class接口
public Interface IDataAccessClass()
{
void Insert(Product product);
}
业务逻辑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
中有存储库接口和具体的 classes,它们在业务逻辑 classes 的 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
的问题你可以在你安装的地方添加一个新项目(class库) NInject 并创建 Register
方法。您可以在 Web
项目中引用此 class 库 并注册实体。
对象
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);
}
}
我刚刚遇到这个 post 并且与原来的 post 有相同的潜在误解,直到我明白:
Class 图书馆就是图书馆。他们不控制依赖项的注入。 DI 在使用这些库的任何应用程序中配置(无论是控制台、ASP.NET、WPF、WinForms 还是其他),即使这些注入仅在 class 库中也是如此。
我在将我的核心模型和 entity framework(使用工作单元)移动到 re-use 的单独 class 库时遇到了这个问题。我花了几个小时试图弄清楚 class 库如何配置它的 DI,最后是 MVC 网络应用程序引用了需要处理它的 class 库。
换句话说,在我实际应用程序的引导程序中,我需要绑定在我引用的 class 库中使用的接口/具体 Classes。
我已经在 MVC Web 应用程序中使用 Ninject 注入业务逻辑 classes 没有任何问题。但是我想将数据访问 classes 注入到业务逻辑 classes 的构造函数中。逻辑层是一个 class 库,没有 Program.cs class 或入口点。
数据访问class
public class DataAccessClass
{
public void Insert(Product product)
{
new SqlObj().Insert(Product);
}
}
数据访问class接口
public Interface IDataAccessClass()
{
void Insert(Product product);
}
业务逻辑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
中有存储库接口和具体的 classes,它们在业务逻辑 classes 的 BLL
层中使用。问题是,为了分离 DAL
和 BLL
,我如何设置 Ninject 以将我的存储库实现注入 BLL
层?
使用 Nuget
安装 NInjectInstall-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
的问题你可以在你安装的地方添加一个新项目(class库) NInject 并创建 Register
方法。您可以在 Web
项目中引用此 class 库 并注册实体。
对象
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);
}
}
我刚刚遇到这个 post 并且与原来的 post 有相同的潜在误解,直到我明白:
Class 图书馆就是图书馆。他们不控制依赖项的注入。 DI 在使用这些库的任何应用程序中配置(无论是控制台、ASP.NET、WPF、WinForms 还是其他),即使这些注入仅在 class 库中也是如此。
我在将我的核心模型和 entity framework(使用工作单元)移动到 re-use 的单独 class 库时遇到了这个问题。我花了几个小时试图弄清楚 class 库如何配置它的 DI,最后是 MVC 网络应用程序引用了需要处理它的 class 库。
换句话说,在我实际应用程序的引导程序中,我需要绑定在我引用的 class 库中使用的接口/具体 Classes。