我有一个MVP应用程序实现.后退按钮工作正常.我想以编程方式返回上一个地方.我该怎么办?
我正在寻找类似的东西:
clientFactory.getPlaceController().goBack();
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有一些MVP模式的问题,特别是在哪里创建我所有类的实例.目前这些都是在program.cs文件中创建的.虽然这有效,但我知道这是糟糕的设计.我很感激,如果有人能给我一些关于如何构建它的指示.
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
private static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var browser = new BrowserWindow();
var helper = new MainPresenterHelper();
var userInterface = new MainForm();
var entity = new UserInputEntity();
var readerWriter = new ReaderWriter();
var manager = new IOManager(readerWriter);
var verif = new VerificationManager(manager);
var entityVerification = new EntityVerification(verif);
var logger = new Logger(entity, readerWriter, true);
var verifyRow = new VerifyRow(entity, logger);
var …Run Code Online (Sandbox Code Playgroud) 如果我有这样的主持人——
public class LandingPresenter : ILandingPresenter
{
private ILandingView _view { get; set; }
private IProductService _productService { get; set; }
public LandingPresenter(ILandingView view, IProductService)
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
考虑到依赖视图不会被注册,我如何向 Autofac 注册这个 Presenter(但 IProductService 会)
builder.RegisterType<LandingPresenter>().As<ILandingPresenter>(); ????
Run Code Online (Sandbox Code Playgroud) 处理多线程时,Presenter通常会收到事件并调用View来更新相应的控件.
主持人:
private void EventAggregator_InfoUpdated(object sender, InfoUpdatedEventArgs e)
{
view.UpdateFeedInfo(e.FeedInfo);
}
Run Code Online (Sandbox Code Playgroud)
视图:
public void UpdateFeedInfo(FeedInfo feedInfo)
{
if (!control.IsHandleCreated && !control.IsDisposed) return;
control.BeginInvoke((MethodInvoker) (() => control.Update(feedInfo)));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在调用view之前在GUI线程中调用presenter中的方法调用.就像是:
private void EventAggregator_InfoUpdated(object sender, InfoUpdatedEventArgs e)
{
//InvokeInUiThread// ManageInfoInput(e.FeedInfo);
}
private void ManageInfoInput(FeedInfo feedInfo)
{
...
view.UpdateFeedInfo(e.FeedInfo);
}
Run Code Online (Sandbox Code Playgroud) 我尝试在WinForms应用程序中实现ModelViewPresenter(MVP)模式.我有一个带按钮的主窗体,当我点击这个按钮时,会显示一个新窗体.遵循MVP模式的最佳方法是什么?我想,我应该从我的演示者中打开第二个表单,以便视图对其他视图一无所知.但我不确定.我的应用程序只有三个对话框.什么是最好的方法?
码
private void LoadAndShowMasterTrackForm()
{
if (GvClaims.SelectedRowsCount < 1)
return;
// Create an empty list.
var rowsToUpdate = new List<TrackData>();
// Add the selected rows to the list.
for (int i = 0; i < GvClaims.SelectedRowsCount; i++)
{
if (GvClaims.GetSelectedRows()[i] >= 0)
{
var track = GvClaims.GetRow(GvClaims.GetSelectedRows()[i]) as TrackData;
if (track != null)
rowsToUpdate.Add(track);
}
}
using (var uow = new UnitOfWork())
{
try
{
GvClaims.BeginUpdate();
var frmSynonyms = new MasterTrackDialog { DataSourceMainGridView = rowsToUpdate, DataSource = rowsToUpdate, SessionUow …Run Code Online (Sandbox Code Playgroud) 在对android模式进行一些研究后,我不断找到不同的答案.有些人会开始讨论设计模式,建筑甚至建筑表现模式.
我得出的结论是,它们都是架构演示模式,但MvC是一种架构模式,而MvP和MvvM是与设计模式观察者相同等级的设计模式.这是对的吗?
我读了很多关于 MVC、MVP 和 MVVM 的文章。大多数文章都以同样的方式提到 MVP 和 MVVM。但只有部分内容提到MVVM的核心部分是绑定。WPF 就是一个很好的例子。
除了绑定之外,MVP 和 MVVM 之间还有什么区别吗?
我想删除重复的代码,所以我想创建一个简单的 MVP 基础视图控制器,它将模型、视图和演示者类型联系在一起并自动连接它们,例如:
class BaseMvpViewController<M: MvpModel, V: MvpView, P: MvpPresenter>: UIViewController {
Run Code Online (Sandbox Code Playgroud)
我的模型和视图是空协议的地方:
protocol MvpModel {}
protocol MvpView: class {} // class is needed for weak property
Run Code Online (Sandbox Code Playgroud)
主持人看起来像这样:
protocol MvpPresenter {
associatedtype View: MvpView
weak var view: View? { get set }
func onAttach(view: View)
func onDetach(view: View)
}
Run Code Online (Sandbox Code Playgroud)
这是我的全部BaseMvpViewController:
class BaseMvpViewController<M: MvpModel, V, P: MvpPresenter>: UIViewController, MvpView {
typealias View = V
var model: M? = nil
var presenter: P!
required public init?(coder aDecoder: NSCoder) {
super.init(coder: …Run Code Online (Sandbox Code Playgroud) 我以前从未创建过单元测试。我计划为我的演示者和数据源创建 UI 测试和单元测试。我在我的应用程序中使用 Retrofit、RxJava 和 Dagger。
这是我迄今为止尝试过的
数据源(我的数据源来自 API)
public class DataSource implements DataSourceContract {
private static DataSource dataSource;
@Inject
SharedPreferences sharedPreferences;
@Inject
NewsService newsService;
private DataSource(Context context) {
DaggerAppComponent.builder()
.networkModule(new NetworkModule(API_URL))
.appModule(new AppModule(context.getApplicationContext()))
.preferencesModule(new PreferencesModule())
.build()
.inject(this);
}
public static synchronized DataSource getInstance(Context context) {
if(dataSource == null) {
dataSource = new DataSource(context);
}
return dataSource;
}
public String parseError(Throwable e) {
if(e instanceof SocketTimeoutException) {
return ERROR_TIMEOUT;
}
else if(e instanceof SocketException) {
return ERROR_NO_CONNECTION;
}
else { …Run Code Online (Sandbox Code Playgroud) 我一直在阅读 MVP(模型-视图-呈现器)及其变体(被动视图、监督视图)的许多示例,以尝试使我的解决方案在 VBA 中更加健壮(并且可重用)(在本例中使用 Excel 作为主机)实例)。我发现的问题是在 VBA 中找到好的、简单的示例,但对于我需要的(希望如此)简单的示例来说,这些示例并不是完全多余的。
我正在尝试创建一个“设置”对话框,将某些配置存储在工作表中(这是我的“存储库”)。
这是我的主要过程,由用户触发:
Private Sub ShowImportSelector()
Dim importPresenter As DataImportPresenter
Set importPresenter = New DataImportPresenter
importPresenter.LoadConfig
If importPresenter.Show = -1 Then Exit Sub
importPresenter.SaveConfig
' begin processing...
If (CStr([Settings.SelectedVersion].Value2) = "QQ") Then
' ...
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
这是我的“演示者”(这里我使用源范围名称和配置目标):
Option Explicit
Private m_importForm As FImport
Private Sub Class_Initialize()
Set m_importForm = New FImport
End Sub
Public Sub LoadConfig()
m_importForm.SetAvailableVersions "tblVERSION"
m_importForm.SetAvailableSalesOrgs "tblSALESORG"
m_importForm.SetAvailableCategories "tblCATEGORY"
m_importForm.ToolName = "Forecast"
End Sub
Public Sub …Run Code Online (Sandbox Code Playgroud)