如何在 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 层对我的 DAL 层一无所知。我的 DAL 中有存储库接口和具体的 classes,它们在业务逻辑 classes 的 BLL 层中使用。问题是,为了分离 DALBLL,我如何设置 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。