如何在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层中使用。问题是,为了解耦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,你可以添加一个新项目(类库),你可以在其中安装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的主要内容,如果未能解决你的问题,请参考以下文章

可以在类库中下载包含代码的文件

如何在 UWP 类库中使用 XAML 静态资源和设计时数据

使用 Ninject 和 wpf 从所有程序集中加载模块

C++调用C#dll类库中的方法(非显性COM)

在C#的类库中可以创建WPF的窗口吗

如何在类库中使用重定向(url)方法?