标签: mvp

TDD测试重构以支持MultiThreading

所以我是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)

tdd mvp multithreading

7
推荐指数
1
解决办法
934
查看次数

设置默认值 - 表示逻辑或业务逻辑?

我想知道是否将SelectList的默认值设置为表示逻辑或业务逻辑?例如,如果要求是没有位置就无法保存员工,但99%的时间选择的位置是特定项目 - 比如亚特兰大.因此,当显示新员工的输入屏幕时,应将位置SelectList默认为亚特兰大.我应该默认模型中还是视图模型中的位置?我意识到的一件事是单元测试变得很尴尬,因为在这两种情况下,我都被迫测试一个始终存在于生产中的位置,但我不能使用我自己的测试数据创建单元测试,除非"亚特兰大"是在测试中使用的一组位置中.一世'

asp.net mvp asp.net-mvc

7
推荐指数
1
解决办法
244
查看次数

有没有人在他们的项目中使用过JBoss Errai?

我正在搜索GWT Design来设置项目.我可以使用MVP(GWTP)JBoss Errai.我还没有决定.是否有人在其中一个经历过?

您可以给出这些框架的优缺点.

mvp gwt gwt-mvp errai

7
推荐指数
1
解决办法
2548
查看次数

如何构建C#WinForms模型 - 视图 - 演示者(被动视图)程序?

我正在设计一个具有以下基本概念的GUI(类似于Visual Studio的基本外观):

  1. 文件导航
  2. 控制选择器(用于选择要在编辑器组件中显示的内容)
  3. 编辑
  4. 记录器(错误,警告,确认等)

现在,我将使用TreeView进行文件导航,使用ListView选择要在编辑器中显示的控件,使用RichTextBox进行Logger.编辑器将具有两种类型的编辑模式,具体取决于TreeView中选择的内容.编辑器将是一个RichTextBox,用于手动编辑文件内的文本,或者它将是一个带有拖放DataGridViews和子文本框的面板,用于在此面板中进行编辑.

我试图遵循被动视图设计模式,将模型与视图完全分离,反之亦然.这个项目的本质是我添加的任何组件都需要编辑/删除.因此,我需要从给定控件到下一个控件的独立性.如果今天我使用TreeView进行文件导航,但明天我被告知要使用其他东西,那么我想要相对容易地实现一个新的控件.

我根本不明白如何构建程序.我理解每个Control的一个Presenter,但我不知道如何使它工作,以便我有一个View(程序的整个GUI)和控件(子视图),这样整个视图是可替换的以及个人反映我的模型的控件.

在主视图中,Passive View标准应该是轻量级的,我是否单独实现子视图?如果是这样,请说我有一个接口INavigator来抽象导航器对象的角色.导航器需要Presenter和Model才能在Navigator View和主View之间进行操作.我觉得我迷失在某个地方的设计模式行话中.

可以在这里找到最相似的相关问题,但它没有足够详细地回答我的问题.

有人请帮我理解如何"构建"这个程序吗?我感谢任何帮助.

谢谢,

丹尼尔

c# mvp design-patterns passive-view winforms

7
推荐指数
1
解决办法
8159
查看次数

Winforms MVP具有多个视图和一个演示者

我正在尝试按照模型视图展示器(MVP)模式在我的应用程序中开发项目管理系统.我的问题是,我看过很多MVP的例子,但我没有看到一个有一个Presenter和多个Views.例如,当用户打开项目时,可以通过树视图,数据网格和图表查看相同的项目数据.我该如何应对?

c# mvp design-patterns winforms

7
推荐指数
1
解决办法
2547
查看次数

MVP,Winforms - EventHandlers或Delegates

我已经在一些使用被动视图的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)

c# mvp winforms

7
推荐指数
1
解决办法
1874
查看次数

依赖注入避免在启动时加载所有内容

我正在尝试使用依赖注入与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)

这与工厂当时依赖于子工厂基本相同,但至少它们比演示者/视图/服务更轻,并且他们不需要在需要之前加载子工厂.

.net mvp dependency-injection

7
推荐指数
1
解决办法
463
查看次数

摆脱GWT MVP样板

关于地点和活动+ MVP的文档,我必须为每个页面创建:

  • 一个地方
  • 一个活动
  • 一个标记化器(我必须实现标记化逻辑)
  • 演示者的界面(活动实现此界面)
  • 视图的界面
  • 视图实现
  • 用于视图实现的ui binder xml
  • app活动映射器中的节点
  • gin模块中的节点,用于绑定视图接口以查看实现

我创建了一个具有基本功能的应用程序(5页和导航栏),我已经有超过1500行代码和~40个文件.我认为这是完全不可维护的,但是我没有找到任何解决这个问题的方法.有几个框架(例如GWTP)实现了MVP,但它们也需要相同数量的样板.

我可以使用spring mvc或play在~200行中实现相同的功能.

我做错了什么,你会如何解决?

java mvp gwt gwt-mvp gwt-places

7
推荐指数
1
解决办法
711
查看次数

dagger2注入不起作用 - SharedPreferences

我正在尝试使用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)

mvp android dependency-injection dagger-2

7
推荐指数
1
解决办法
4373
查看次数

Rails Presenters文件夹有什么用?

Rails Presenters文件夹有什么用?该文件夹中有什么?为什么需要此文件夹?

ruby directory mvp ruby-on-rails

7
推荐指数
2
解决办法
4545
查看次数