所以我是TDD的新手,我使用MVP模式成功创建了一个不错的小样本应用程序.我当前解决方案的主要问题是它阻止了UI线程,所以我试图设置Presenter以使用SynchronizationContext.Current,但是当我运行我的测试时,SynchronizationContext.Current为null.
演讲者在线程之前
public class FtpPresenter : IFtpPresenter
{
...
void _view_GetFilesClicked(object sender, EventArgs e)
{
_view.StatusMessage = Messages.Loading;
try
{
var settings = new FtpAuthenticationSettings()
{
Site = _view.FtpSite,
Username = _view.FtpUsername,
Password = _view.FtpPassword
};
var files = _ftpService.GetFiles(settings);
_view.FilesDataSource = files;
_view.StatusMessage = Messages.Done;
}
catch (Exception ex)
{
_view.StatusMessage = ex.Message;
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
线程测试
[TestMethod]
public void Can_Get_Files()
{
var view = new FakeFtpView();
var presenter = new FtpPresenter(view, new FakeFtpService(), new FakeFileValidator());
view.GetFiles();
Assert.AreEqual(Messages.Done, …Run Code Online (Sandbox Code Playgroud) 我想知道是否将SelectList的默认值设置为表示逻辑或业务逻辑?例如,如果要求是没有位置就无法保存员工,但99%的时间选择的位置是特定项目 - 比如亚特兰大.因此,当显示新员工的输入屏幕时,应将位置SelectList默认为亚特兰大.我应该默认模型中还是视图模型中的位置?我意识到的一件事是单元测试变得很尴尬,因为在这两种情况下,我都被迫测试一个始终存在于生产中的位置,但我不能使用我自己的测试数据创建单元测试,除非"亚特兰大"是在测试中使用的一组位置中.一世'
我正在搜索GWT Design来设置项目.我可以使用MVP(GWTP)或JBoss Errai.我还没有决定.是否有人在其中一个经历过?
您可以给出这些框架的优缺点.
我正在设计一个具有以下基本概念的GUI(类似于Visual Studio的基本外观):
现在,我将使用TreeView进行文件导航,使用ListView选择要在编辑器中显示的控件,使用RichTextBox进行Logger.编辑器将具有两种类型的编辑模式,具体取决于TreeView中选择的内容.编辑器将是一个RichTextBox,用于手动编辑文件内的文本,或者它将是一个带有拖放DataGridViews和子文本框的面板,用于在此面板中进行编辑.
我试图遵循被动视图设计模式,将模型与视图完全分离,反之亦然.这个项目的本质是我添加的任何组件都需要编辑/删除.因此,我需要从给定控件到下一个控件的独立性.如果今天我使用TreeView进行文件导航,但明天我被告知要使用其他东西,那么我想要相对容易地实现一个新的控件.
我根本不明白如何构建程序.我理解每个Control的一个Presenter,但我不知道如何使它工作,以便我有一个View(程序的整个GUI)和控件(子视图),这样整个视图是可替换的以及个人反映我的模型的控件.
在主视图中,Passive View标准应该是轻量级的,我是否单独实现子视图?如果是这样,请说我有一个接口INavigator来抽象导航器对象的角色.导航器需要Presenter和Model才能在Navigator View和主View之间进行操作.我觉得我迷失在某个地方的设计模式行话中.
可以在这里找到最相似的相关问题,但它没有足够详细地回答我的问题.
有人请帮我理解如何"构建"这个程序吗?我感谢任何帮助.
谢谢,
丹尼尔
我正在尝试按照模型视图展示器(MVP)模式在我的应用程序中开发项目管理系统.我的问题是,我看过很多MVP的例子,但我没有看到一个有一个Presenter和多个Views.例如,当用户打开项目时,可以通过树视图,数据网格和图表查看相同的项目数据.我该如何应对?
我已经在一些使用被动视图的WinForms应用程序中实现了MVP模式.我实现了一个包含Action <T>和Func <T>形式的属性和委托的接口,以在具体视图中连接UI事件并回调给演示者.
我即将开始一个新项目并对在线模式进行了一些研究,包括这里的模式的许多示例,并注意到所有使用EventHandler来通知演示者.
我真的不明白为什么会在这种情况下使用事件,因为我看到一个视图只有一个演示者.
我的问题是,这是为了与.Net框架如何使用事件保持一致,还是出于其他原因我没有看到?
这是我使用的模式的一个简单示例:
public interface IViewAbstraction
{
public ModelData ModelData { set; }
public Action<ModelData> ModelDataChangedCallback { set; }
}
public class SomeWinForm : Form, IViewAbstraction
{
private Action<ModelData> modelDataChanged;
private ModelData model;
public ModelData ModelData
{
set { /* when this property changes, update UI */ }
}
public Action<ModelData> ModelDataChangedCallback
{
set { modelDataChanged = value; }
}
private void OnSomeWinformsEvent(EventArgs args)
{
if (modelDataChanged == null) throw new Exception();
modelDataChanged(model);
}
}
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用依赖注入与MVP将所需的依赖项注入构造函数.我遇到的问题是,如果我在根MainWindowPresenter上使用依赖注入,所有它的子演示者及其子演示者,视图和服务都将在启动时加载.由于所有内容都是直接或间接从MainWindowPresenter加载的,这意味着整个应用程序将在启动时加载到内存中.
我知道在.NET中创建所有对象在启动时可能不会花费很多,但我不禁认为这是浪费内存,因为它们永远不会同时被使用.有一些像AboutPresenter或HelpPresenter可能永远不会被使用.我错过了或者这是依赖注入应该如何工作?有没有解决的办法?
我能找到解决这个问题的唯一方法是使用工厂,然后可以在需要时创建子演示者/视图/服务.例如:
class HelpFactory : AbstractHelpFactory
{
public IHelpPresenter Create()
{
IHelpService helpService = new ConcreteHelpService();
IHelpView helpView = new ConcreteHelpView();
HelpSearchPresenter searchPresenter = HelpSearchFactory.Create();
return HelpPresenter(helpView, helpService, searchPresenter);
}
}
Run Code Online (Sandbox Code Playgroud)
这与工厂当时依赖于子工厂基本相同,但至少它们比演示者/视图/服务更轻,并且他们不需要在需要之前加载子工厂.
关于地点和活动+ MVP的文档,我必须为每个页面创建:
我创建了一个具有基本功能的应用程序(5页和导航栏),我已经有超过1500行代码和~40个文件.我认为这是完全不可维护的,但是我没有找到任何解决这个问题的方法.有几个框架(例如GWTP)实现了MVP,但它们也需要相同数量的样板.
我可以使用spring mvc或play在~200行中实现相同的功能.
我做错了什么,你会如何解决?
我正在尝试使用Dagger2进行Dependancy Injection .它在构建阶段给出错误,并表示无法注入SharedPreference实例.
这是我的模块和组件.
Application Module
@Module
public class ApplicationModule {
private Application app;
private String PREF_NAME = "prefs";
public ApplicationModule(Application app) {
this.app = app;
}
@Singleton
@Provides
public Picasso getPicasso() {
return new Picasso.Builder(app).build();
}
@Singleton
@Provides
public SharedPreferences getAppPreferences() {
return app.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
}
}
Run Code Online (Sandbox Code Playgroud)
ApplicationComponent
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(App app);
}
Run Code Online (Sandbox Code Playgroud)
App.java
public class App extends Application {
ApplicationComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
createDaggerInjections();
}
public …Run Code Online (Sandbox Code Playgroud) Rails Presenters文件夹有什么用?该文件夹中有什么?为什么需要此文件夹?