如何在一个项目中定义所有依赖项?

时间:2014-03-15 13:31:06

标签: architecture dependency-injection ninject asp.net-mvc-5 ninject.web.mvc

我有6个项目。

  1. Asp.NET MVC 5项目,它依赖于服务项目(例如,Asp.NET项目需要 IAccountService ,这是在服务项目)。
  2. DependencyInjection项目,它必须管理整个解决方案中的依赖项。这个项目有Ninject,Ninject.Web.Common和Ninject.Web.Mvc的参考。现在,这个项目什么都不做。
  3. 域项目,其中包含POCO类(例如,类帐户)和合同(例如 IAccountService )。
  4. 基础架构项目,其中包含实体框架,存储库和 UnitOfWork
  5. 服务项目,实施域名合同(例如,服务项目具有类AccountService,实现IAccountService)。该项目取决于 Infrastructure.UnitOfWork
  6. 测试项目。它将测试服务项目。
  7. 换句话说,有以下依赖关系图:

    1. Asp.NET MVC 5 - > Domain.Contracts
    2. 域没有任何依赖关系。
    3. Infrastructure.UnitOfWork - > UnitOfWork.ApplicationDbContext
    4. 服务 - > Infrastructure.UnitOfWork
    5. 测试项目 - > Domain.Contracts
    6. 我想将所有依赖项放在DependencyInjection项目中。抽象地说,我想把这段代码:

      Bind<UnitOfWork>().To<UnitOfWork>();
      Bind<IAccountService>().To<AccountService>();
      ......
      

      DependencyInjection项目中的任何位置。然后我想写:

      public class HomeController : BaseController
      {
          private readonly IAccountService accountService;
      
          public HomeController(IAccountService accountService)
          {
              this.accountService = accountService;
          }
      
          public ActionResult Index()
          {
              accountService.DepositMoney(10);
      
              return View();
          }
      }
      

      并有工作申请。

      我是怎么做到的?我尝试了从NinjectModule继承的创建类(例如,我有以下类:

      public class ServiceModule : NinjectModule
      {
          public override void Load()
          {
              Bind<UnitOfWork>().To<UnitOfWork>();
              Bind<IAccountService>().To<AccountService>();
          }
      }
      

      然后,在Global.asax.cs(ASP.NET MVC 5项目)中,我编写了以下代码:

      public class MvcApplication : NinjectHttpApplication
      {
          protected override void OnApplicationStarted()
          {
              base.OnApplicationStarted();
      
              AreaRegistration.RegisterAllAreas();
              FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
              RouteConfig.RegisterRoutes(RouteTable.Routes);
              BundleConfig.RegisterBundles(BundleTable.Bundles);
          }
      
          protected override IKernel CreateKernel()
          {
              var modules = new INinjectModule[]
              {
                  new InfrastructureModule(),
                  new ServiceModule()
              };
      
              var kernel = new StandardKernel(modules);
              kernel.Load(Assembly.GetExecutingAssembly());
              return kernel;
          }
      }
      

      然后,我在Web.config中添加以下代码:

      <system.web>
          <httpModules>
              <add name="NinjectHttpModule" type="Ninject.Web.Common.NinjectHttpModule"/>
          </httpModules>
      </system.web>
      

      结果,我有一个例外:

      激活IntPtr时出错 没有匹配的绑定可用,并且该类型不可自绑定。 激活路径:

      3)将依赖IntPtr注入到Func {IKernel}

      类型的构造函数的参数方法中

      2)将依赖关系Func {IKernel}注入到HttpApplicationInitializationHttpModule类型的构造函数的参数lazyKernel中

      1)请求IHttpModule

      我感到困惑。我会很高兴任何建议。

0 个答案:

没有答案