Asp.net mvc 2 在我的服务层项目中,我应该将Ioc(ninject)代码放在哪里?

Asp.net mvc 2 在我的服务层项目中,我应该将Ioc(ninject)代码放在哪里?,asp.net-mvc-2,dependency-injection,ioc-container,repository-pattern,ninject,Asp.net Mvc 2,Dependency Injection,Ioc Container,Repository Pattern,Ninject,我有3个项目文件 webui - controllers and views framework - service layer and repos tests- unit tests 因此,我认为我的控制器只会与包含我的业务逻辑的服务层通信。服务层将与repo对话并获取数据库数据 我的回购协议只会处理数据库并返回数据 现在,如果我想进行单元测试,我需要有假服务层和假存储库 通过这种方式,我可以隔离测试控制器,隔离测试服务层 那么,我应该把我的ninject代码放在我的框架类库中的什么地方,这

我有3个项目文件

webui - controllers and views
framework - service layer and repos
tests- unit tests
因此,我认为我的控制器只会与包含我的业务逻辑的服务层通信。服务层将与repo对话并获取数据库数据

我的回购协议只会处理数据库并返回数据

现在,如果我想进行单元测试,我需要有假服务层和假存储库

通过这种方式,我可以隔离测试控制器,隔离测试服务层

那么,我应该把我的ninject代码放在我的框架类库中的什么地方,这样我就可以在我的服务层中使用它了

编辑

史蒂文,你是说我应该这样做

//使用mvc扩展在全局aspx中设置ninject

//现在把东西捆起来

private class SportsStoreServices : NinjectModule
        {
            public override void Load()
            {

                Bind<IAdminService>().To<AdminService>();
                Bind<IAdminRepo>().To<AdminRepo>();
            }
        }
//服务层

public class AdminService : IAdminService
{

   private IAdminRepo adminRepo;
   public AdminService(IAdminRepo adminRepo)
   {
      this.adminRepo = adminRepo;
   }

   public List<Admins> GetAllAdmins()
   {

       return adminRepo.GetAllAdmins();
   }   

}


//Repo
    public class AdminRepo : IAdminRepo
    {
       public List<Admins> GetAllAdmins()
       {
          // some query to get all admins
       }
    } 

当您正确且完全地遵循依赖项注入模式时,您需要引用IoC容器的唯一位置就是您的应用程序根目录(在您的web项目中)。对于MVC,您通常会有一个ControllerFactory,它知道如何使用特定的IoC框架创建新的控制器。您的控制器将围绕构造函数注入进行设计,以便您的IoC框架能够自动注入所有依赖项。您通常会在整个项目中使用构造函数注入。这允许您让代码的其余部分不知道choosen IoC实现

对于单元测试,您通常会使用构造函数注入来手动注入依赖项。这使您无需为单元测试配置IoC框架。在测试项目中使用IoC库是痛苦的,因为您经常希望每个测试用例返回不同的依赖项,而测试框架通常并行运行您的测试。所以最好不要在测试中使用任何IoC框架,而是自己调用被测类型的构造函数


使用DI进行单元测试的诀窍是保持单元测试的可维护性。例如,您可以通过将被测类型的创建提取到工厂方法中来实现这一点。这允许您在代码中的一个位置调用这样的构造函数。当构造函数更改时,您将不得不在一个地方更改测试代码。通过这本书,我学到了很多关于编写可维护单元测试的知识。我可以向您推荐。

当您正确、完整地遵循依赖注入模式时,您需要引用IoC容器的唯一位置就是您的应用程序根目录(在您的web项目中)。对于MVC,您通常会有一个ControllerFactory,它知道如何使用特定的IoC框架创建新的控制器。您的控制器将围绕构造函数注入进行设计,以便您的IoC框架能够自动注入所有依赖项。您通常会在整个项目中使用构造函数注入。这允许您让代码的其余部分不知道choosen IoC实现

对于单元测试,您通常会使用构造函数注入来手动注入依赖项。这使您无需为单元测试配置IoC框架。在测试项目中使用IoC库是痛苦的,因为您经常希望每个测试用例返回不同的依赖项,而测试框架通常并行运行您的测试。所以最好不要在测试中使用任何IoC框架,而是自己调用被测类型的构造函数


使用DI进行单元测试的诀窍是保持单元测试的可维护性。例如,您可以通过将被测类型的创建提取到工厂方法中来实现这一点。这允许您在代码中的一个位置调用这样的构造函数。当构造函数更改时,您将不得不在一个地方更改测试代码。通过这本书,我学到了很多关于编写可维护单元测试的知识。我可以推荐它。

在项目中,DI应该位于可以进行对象合成的地方。。例如,在WCF服务项目中,我们可以使用asp.net Global.asax中的IInstanceProvider来完成。
基本规则:确保DI是项目的应用程序启动点,DI应该位于可以进行对象合成的地方。。例如,在WCF服务项目中,我们可以使用asp.net Global.asax中的IInstanceProvider来完成。
基本规则:确保DI是应用程序启动点

您是否使用ninject.web.mvc?服务层对Ninject一无所知。目前还不知道。我只是遵循了作者在pro asp.net mvc 2.0中所做的操作。然而,这不仅仅解决了我在webui部分的问题。不是服务层?它自己的项目文件夹和repo中有什么classes@dotjoe-那么我如何隔离和测试我的服务层呢?我不想在我的服务层上运行单元测试,这样会影响实际的数据库。我也不认为我应该通过控制器在单元测试中调用服务层,您应该只进行测试
关于编辑的一个方面:您的代码似乎非常正确。您一直在进行构造函数注入,并且在global.asax中只有Ninject配置。顺便说一句,下次更新问题时,别忘了添加评论。因此,当问题更新时不会通知。您使用的是ninject.web.mvc吗?服务层对Ninject一无所知。目前还不知道。我只是遵循了作者在pro asp.net mvc 2.0中所做的操作。然而,这不仅仅解决了我在webui部分的问题。不是服务层?它自己的项目文件夹和repo中有什么classes@dotjoe-那么我如何隔离和测试我的服务层呢?我不想在我的服务层上运行单元测试,这样会影响实际的数据库。我也不认为我应该通过控制器在单元测试中调用服务层。你应该只测试编辑的一部分:你的代码似乎很正确。您一直在进行构造函数注入,并且在global.asax中只有Ninject配置。顺便说一句,下次更新问题时,别忘了添加评论。因此,在问题更新时不会通知。
public class AdminService : IAdminService
{

   private IAdminRepo adminRepo;
   public AdminService(IAdminRepo adminRepo)
   {
      this.adminRepo = adminRepo;
   }

   public List<Admins> GetAllAdmins()
   {

       return adminRepo.GetAllAdmins();
   }   

}


//Repo
    public class AdminRepo : IAdminRepo
    {
       public List<Admins> GetAllAdmins()
       {
          // some query to get all admins
       }
    }