爲了讓你在正確的方向,我建議你看一看的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 Silk和CodeCampServer。他們都在一定程度上實現了「洋蔥」概念(當然,我正在研究解決方案,UI Web項目包含一個包含所有Repos的Data Proj參考)
讓我知道你怎麼看。
Duplicate of:http://stackoverflow.com/questions/5267525/dal-bll-gui-composition-root-how-to-setup-di-bindings – 2011-06-06 00:40:11