我在Windows窗体应用程序中使用MVP模式.我需要更改视图上的单选按钮.我可以通过在视图上公开一个布尔属性来做到这一点,但是我应该使用事件来操纵视图吗?
我已经阅读了很多关于MVP模式的文章.有些人说这太复杂了,有人说它已经过时了.然而对我来说,它似乎是提供单元测试访问UI的完美方式 - 这是我的目标.
你有没有使用过MVP,如果有的话你怎么看?
我对 GWT的理解是它首先发布了活动和场所的概念,以支持UI作为状态机的想法,其中每个状态是UI的可书籍配置.
我的理解是GWT后来发布了他们的建议,用MVP架构模式构建GWT应用程序,以便更好地分离关注点和更容易的单元测试.
但是,当你有下载示例应用程序,真正看看源代码,虽然这两个观念培育有client,server和shared封装结构,其内部运行基于不同的理念和不同的核心类型.基本上,似乎你必须在一个或另一个之间做出选择(这是真的吗?).
现在我看到GWTP(GWT平台).这看起来像是活动/地方范例以及MVP设计的完美结合.所以我问:如果我选择使用GWTP,那么在活动/地方或MVP领域有什么我会错过的吗?换句话说,通过使用GWTP,我限制自己并被禁止使用这两个项目中的任何最佳实践或组件?提前致谢!
我正在GWT应用程序中实现MVP模式.在每个历史记录标记更改时,我正在初始化演示者以获取相应的视图.如果用户导航到单个视图GridView(比如说)2次,那么相应的演示者GridViewPresenter(说)初始化2次(根据MVP模式.如果我们不将演示者作为singelton).喜欢
Presenter presenter = new GridViewPresenter();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,此演示者中的所有事件都将注册并收听2次.如果不让我们的主持人singelton,我们怎么能避免这种情况.
在MVP winforms应用程序中,我在DAL中处理如下异常.
由于用户消息传递不是DAL的责任,我想将其移到我的Presentation类中.
你能告诉我一个标准的方法吗?
public bool InsertAccount(IBankAccount ba)
{
string selectStatement = @"IF NOT EXISTS (SELECT ac_no FROM BankAccount WHERE ac_no=@ac_no) BEGIN INSERT INTO BankAccount ...";
using (SqlConnection sqlConnection = new SqlConnection(db.ConnectionString))
{
using (SqlCommand sqlCommand = new SqlCommand(selectStatement, sqlConnection))
{
try
{
sqlConnection.Open();
sqlCommand.Parameters.Add("@ac_no", SqlDbType.Char).Value = ba.AccountNumber;
//
//
sqlCommand.ExecuteNonQuery();
return true;
}
catch (Exception e) { MessageBox.Show(("Error: " + e.Message)); }
if (sqlConnection.State == System.Data.ConnectionState.Open) sqlConnection.Close();
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
所以根据答案,我重新编辑了帖子,现在我的异常处理代码看起来像这样......
DAL
public bool InsertAccount(IBankAccount ba) …Run Code Online (Sandbox Code Playgroud) 我使用RxJava/ Retrofit在Android应用程序与MVP模式.
现在我想清理xxxPresenter什么时候Activity/Fragment为了防止破坏oom.
Presenter简单代码:
public class LoginPresenter {
private LoginView mLoginView;
private LoginMode mLoginMode;
private Subscriber mLoginSubscriber;
public LoginPresenter(LoginView loginView) {
this.mLoginView = loginView;
mLoginMode = new LoginMode();
}
void login(String userName, String pwd) {
mLoginSubscriber = new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
if (mLoginView != null) {
mLoginView.onLoginSuccess();
}
}
};
mLoginMode.login(userName, pwd, mLoginSubscriber); …Run Code Online (Sandbox Code Playgroud) 我正在尝试用MVP和Dagger建立一个应用程序,
该视图是一个Activity其中实现了一个图界面.
public class OverviewActivity extends AppCompatActivity implements OverviewContract.View {
@Inject OverviewPresenter presenter;
@BindView(R.id.history_days) ListView HistoryLabels;
@BindView(R.id.history_events) ListView HistoryEvents;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overview);
ButterKnife.bind(this);
DaggerOverviewComponent.create().inject(this);
}
@Override
public void showHistory(List<Exercise> history) {
// ...
}
@Override
public void updateScoreSlider(float value) {
// ...
}
@OnClick(R.id.add_event_button)
public void addEvent(View v){
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
该演示看起来像这样
public class OverviewPresenter implements OverviewContract.Events {
OverviewContract.View view;
public OverviewPresenter( OverviewContract.View overviewView ) {
view = …Run Code Online (Sandbox Code Playgroud) 我正在使用干净的体系结构创建一个聊天应用程序,我想检查用户在应用程序启动时是否已登录,如果用户未登录则打开登录屏幕,所以我的问题是:
最好的实现方法是什么?我是否应该LoginActivity启动启动器活动并检查LoginPresenter启动时间(如果用户已经登录)然后打开MainActivity?我应该把检查用户是否已通过身份验证的逻辑放在哪里(IsLoggedInUseCase也许?)?
我真的不了解存储库和用例之间的区别是什么,当已经有and 时,为什么还要创建一个GetAllUsersUseCaseand ..etc 。为什么要制作一个全新的类来引用存储库中已经存在的方法?EditUserUseCaseUsersRepository.getAllUsers()UsersRepository.editUser(User user)
我实现了MVP模式的应用程序Loader,以保持对视娱乐演示对象(有关于这个的文章在这里).我是Dagger 2的新手,试图与当前代码一起实现它.
我已经设法使它工作,但现在我的演示者创建了两次.起初它是使用初始化的工厂类创建的onCreateLoader,但是当添加Dagger 2实现时,我创建了两个对象(在工厂类和注入时).
现在我避免创建一个新的演示者onCreateLoader并改为传递注入的演示者.问题在于视图重新创建:每次销毁和重新创建视图时,都会在OnCreate/中注入一个新的演示者OnCreateView.这是场景:
注入一个新的演示者:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
getControllerComponent().inject(this);
...
}
Run Code Online (Sandbox Code Playgroud)初始化Loader,onCreateLoader被称为如果Loader不存在.请注意,我们通过了注入的演示者:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(PRESENTER_LOADER_ID, null, this);
}
@Override
public Loader<MyPresenter> onCreateLoader(int id, Bundle args) {
switch (id) {
case PRESENTER_LOADER_ID:
return new PresenterLoader<>(getContext(), presenter);
//return new PresenterLoader<>(getContext(), new MyPresenterFactory());
}
return null;
}
Run Code Online (Sandbox Code Playgroud)分配从中收到的演示者Loader.如果它刚刚创建,我们分配已经分配的相同对象,所以没有任何反应.但是,如果视图被重新创建,那么Dagger 2会注入一个新的演示者,在这里我们扔掉新的演示者并用旧的演示者替换它 …
我有一个被调用的对象Product,我想从所有产品列表中检索某个产品的"物料清单"(存储在SQL Server中).我应该先创建Product对象,然后通过方法从我的存储库中获取数据,如下所示:
var productId = "1";
Product product = new Product(productId);
DataTable billOfMaterial = product.GetBillOfMaterial();
Run Code Online (Sandbox Code Playgroud)
或者从静态存储库检索数据strait,如下所示:
var productId = "1";
DataTable billOfMaterial = product.GetBillOfMaterial(productId);
Run Code Online (Sandbox Code Playgroud)
或者可能是这样的?
var productId = "1";
DataTable BillOfMaterial = ProductRepository.GetBillOfMaterial(productId);
Run Code Online (Sandbox Code Playgroud)
或者也许当我创建产品时,我会自动在产品的构造函数中获取Bill:
var productId = "1";
Product product = new Product(productId);
DataGrid.DataSource = product.BillOfMaterial;
Run Code Online (Sandbox Code Playgroud)
我正在使用MVP模式,并且不知道最佳做法是填充对象只是为了获得DataTable或者我是否可以快速使用静态存储库.这样做的正确方法是什么?