如何在c#类库中使用Ninject

时间:2015-04-18 14:03:51

标签: c# dependency-injection .net-4.0 ninject

我在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层?

2 个答案:

答案 0 :(得分:3)

使用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);
    }
}

答案 1 :(得分:0)

我刚刚看过这篇文章,并与原始海报有相同的潜在误解,直到我了解:

类库就是库。它们不控制依赖项的注入。即使在那些注入仅在类库中,也可以在使用这些库的任何应用程序中配置DI(无论是控制台,ASP.NET,WPF,WinForms还是其他)。

将核心模型和实体框架(使用工作单元)移动到单独的类库中以供重用时,遇到了这个问题。我花了几个小时试图弄清楚该类库如何配置其DI,最后还是MVC Web应用程序引用了需要处理它的类库。

换句话说,在我的实际应用程序的引导程序中,我需要绑定引用的类库中使用的接口/具体类。