簡體   English   中英

如何在ac#類庫中使用Ninject

[英]How to use Ninject inside a c# class library

我在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:表示層(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應用程序引用需要處理它的類庫。

換句話說,在我的實際應用程序的引導程序中,我需要綁定在我引用的類庫中使用的接口/具體類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM