这些项目计划针对多平台,所以我在类库中提取了最大的代码,以便它可以轻松重用。
该架构基于模型-视图-演示者原则。
项目结构如下:
Solution
-> Domain
-> Domain.Tests
-> MVP
-> MVP.Tests
-> Web
-> Web.Tests
-> Windows
-> Windows.Tests
MVP
该项目包含项目的演示者和视图。例如:
public interface IApplicationView : IView, IHasUiHandler<IApplicationUiHandler> {
}
public class ApplicationPresenter : Presenter<IApplicationView>
, IApplicationUiHAndler {
public ApplicationPresenter(IApplicationView view) : base(view) {
View.Handler = this;
}
}
视窗
该项目包含应用程序的 WPF GUI,以及所谓的 Composition Root。例如:
public class ApplicationWindow : Window, IApplicationView {
}
public class App : Application {
protected override void OnStartUp(StartupEventArgs e) {
IKernel kernel = new StandardKernel();
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().EndingWith("Window")
.BindAllInterfaces().EndingWith("View") // Here's what I'd like to do.
);
}
}
网络
该项目包含应用程序的 ASP.NET GUI 页面,以及所谓的 Composition Root。
public class ApplicationPage : Page, IApplicationView {
}
public class MvcApplication : HttpApplication {
protected override void Application_Start() {
IKernel kernel = new StandardKernel();
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().EndingWith("Page")
.BindAllInterfaces().EndingWith("View") // Here's what I'd like to do.
}
}
嗯,我想你明白了……
我对依赖注入很陌生,甚至在约定绑定方面也很新。
我想知道如何使用 Ninject 使用约定配置绑定。
知道如何将这些视图与 Windows (WPF) 和 Pages (Web) 绑定吗?
编辑
在尝试了@BatteryBackupUnit 的建议后,我想我的问题全在于我对程序集的搜索。
using (var kernel = new StandardKernel())
kernel.Bind(scanner => scanner
.From(AppDomain.CurrentDomain
.GetAssemblies()
.Where(a => (a.FullName.Contains("MyProject.MVP")
|| a.FullName.Contains("Windows"))
&& !a.FullName.Contains("Tests")))
.SelectAllClasses()
.EndingWith("Window")
.BindSelection((type, baseType) =>
type.GetInterfaces().Where(iface => iface.Name.EndsWith("View"))));
如前所述,View
接口与类不在同一个程序集中Window
。上面的代码基于@BatteryBackupUnit 的回答,效果很好。