8

我在我的ASP.NET MVC3項目中使用NinjectMVC3如何告訴Ninject綁定到它沒有參考的實現

我有3層

  • Foo.Web
  • Foo.Services
  • Foo.Data

Foo.Web引用Foo.Services但不Foo.Data。我的一個服務看起來像這樣

public class FooService : IFooService 
{ 
    private readonly IFooRepository _fooRepository; 

    public FooService(IFooRepository fooRepository) 
    { 
     _fooRepository = fooRepository; 
    } 

    // ... 
} 

NinjectMVC3執行在Foo.Web啓動

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IFooService>().To<FooService>(); 
    kernel.Bind<IFooRepository>().To<FooRepository>(); 
    // Foo.Web doesn't know what FooRepository is 
}   

如何從Foo.Web注入FooServices依賴這種方法引導?

+1

Duplicate of:http://stackoverflow.com/questions/5267525/dal-bll-gui-composition-root-how-to-setup-di-bindings – 2011-06-06 00:40:11

回答

7

爲了讓你在正確的方向,我建議你看一看的onion architecture.

它的基本前提是,任何代碼都可以依賴於層的更多的中央。在您的場景中(對於使用Repository模式的MVC3應用程序來說這是常見的),您的UI應該具有對服務層的引用,並且可以接受對數據層的引用。如果你願意接受這一點(如果你來自傳統的N層設置,這是一個難以忍受的藥丸,我知道),那麼你的情況就變得簡單多了。

隨着Ninject你現在要做的事情如下:

在你NinjectMVC3.cs提交您CreateKernel變得

/// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] 
          { 
           new ServiceDIModule(), 
           new RepositoryDIModule() 
          }; 

     var kernel = new StandardKernel(modules); 

     //RegisterServices(kernel); <-- Only if you have some custom binding 
     //        that are UI specific 
     return kernel; 
    } 

現在,在你的服務層,您添加到Ninject(只是普通Ninject參考通過的NuGet,不通過的NuGet的MVC3脫入),並添加什麼我打電話,看起來像這樣的ServiceDIModule以上:

using Ninject.Modules; 

namespace MyServiceLayer 
{ 
    public class ServiceDIModule : NinjectModule 
    { 
     public override void Load() 
     { 
      //Bind Services 
      Bind<IPracticeService>().To<PracticeService>().InRequestScope(); 
     } 
    } 
} 

和你重複同樣的過程FO R上的數據層注射,你可能有(的UnitOfWork,DatabaseFactory,IFooRepository等)

namespace MyDataLayer 
{ 
    public class RepositoryDIModule : NinjectModule 
    { 
     public override void Load() 
     { 
      //Bind Repos 
      Bind<IFooRepository>().To<FooRepository>().InRequestScope(); 
     } 
    } 
} 

現在,您可以訪問所有綁定的,你需要這樣的前期。所以,你對我的問題真的歸結爲思維的轉變。如果您可以接受(不情願地或以其他方式)洋蔥概念,則您的情況會乾淨地解決。

您還可以檢出Project SilkCodeCampServer。他們都在一定程度上實現了「洋蔥」概念(當然,我正在研究解決方案,UI Web項目包含一個包含所有Repos的Data Proj參考)

讓我知道你怎麼看。

+0

有趣。我仍然不確定你是否只是想讓我開除;但是我會玩這個主意。謝謝。 – MVCDatabaseInitializer 2011-06-06 02:03:37

+0

精彩信息,謝謝@Khepri – 2011-08-11 11:55:15

相關問題