How to use Ninject across assemblies

I can see that similar questions has been asked previously, but being totally new to DI and .Net I am not able to grasps the entire solution or may not have found the right source....

  • I have assemblies WebAPI,BL,DL.
  • WebAPI is dependent on BL,
  • BL is dependent on DL,
  • WebAPI DOES NOT reference DL and I would like to keep it the same. There are few more assemblies but this is sufficient to illustrates the issues.
  • WebAPI has application start section therefore I can use it to initialize the Ninject Kernel and register dependencies for WebAPI project.

    How could I achieve the same for BL and other assemblies?


    There are a couple of different ways, you can use the Ninject Conventions to automagically resolve every ISomething to an implementation that has the same name (eg IThing -> Thing ) or you can create a Ninject Module in each assembly which registers the dependencies (the module in your BL could load the module in your DL).

    The approach you take would depend on whether you need to define different scopes for different objects, for example if you wanted some things resolved as singletons that may affect which method you use.


    I think Mark Seemann's advice about this is great -- make a composition root at the highest possible layer of your application. For Web apps, this means in the Globals.asax file. I could expound on the good reason's for this, but the linked blog post does a better job.

    This does break the layering you are trying to achieve, but only barely, and what I think is an appropriate way. If your web layer is appropriately thin (ie, you could replace it with a thick client fairly easily) then it isn't a big loss. If you are really adverse to that, you could create a composition root in the BL for the DL.

    链接地址: http://www.djcxy.com/p/11354.html

    上一篇: erlang中的函数相等/排序

    下一篇: 如何在组件中使用Ninject