重用MVP模式的代码

时间:2011-04-20 17:33:54

标签: c# .net mvp

我的MVP模式项目中有用户注册功能,也是一个问题。

我可以在一些不同的地方进行用户注册,具体取决于它的位置,是否需要某些字段。

例如,如果用户在网上注册,则需要信用卡信息,但不需要注册管理区域。

我不知道该怎么做,如何强加这条规则。

谢谢!

3 个答案:

答案 0 :(得分:1)

正如@Adam Rackis所说,你的问题有点模糊,但我会猜测你的意思。

如果您只是想从表单中删除某些字段,只需在视图中添加条件:

@if(!Model.inAdminArea)
{
<!-- put credit card field, etc here -->
}

根据您的模型的验证设置,您可能需要修改模型以为这些字段创建虚拟条目,这样您就不会收到验证错误。

但是,这似乎过于简单 - 在你的问题中添加一些细节。

答案 1 :(得分:0)

首先,我会在处理视图时推荐接口隔离原则: 公共接口IForm { event EventHandler提交; event EventHandler取消; }

public interface IFormData {  TDto Item {get; set;} }

然后使用派生界面:

public interface MyFormInterface:IFormData,IForm {}

然后,演示者也可以仅基于场景并保持域不可知。 等...

希望这有帮助!

答案 2 :(得分:0)

听起来你需要拥有多个视图和演示者。视图可能遵循一些继承链以获得视图上的重用。

// Base requirements for user registration.
public interface IUserRegistrationView {
    string FirstName { get; }
    string LastName { get; }
    string EmailAddress { get; }
    string Password { get; }
}

public interface ISelfRegistrationView : IUserRegistrationView {
    string CreditCardNumber { get; }
    CardType CreditCardType { get; }
    DateTime CreditCardExpirationDate { get; }    
}

然后您将需要两位演示者。一个用于 Admin 注册,另一个用于自助注册

只要您有某种支持性的商业服务来完成实际工作(创建用户) - 那么您可以做这样的事情......

public class AdminRegisterNewUserPresenter : BasePresenter
{
    private readonly IUserRegistrationView view = null;
    public AdminRegisterNewUserPresenter(IUserRegistrationView view) { this.view = view; }

    public void RegisterNewUser()
    {
        try 
        {
            UserBusinessService service = new UserBusinessService();
            service.AdminRegisterNewUser(this.view.FirstName, 
                this.view.LastName, this.view.EmailAddress, this.view.Password);
        } 
        catch(Exception e)
        {
            base.HandleError(e);
        }
    }
}

public class SelfRegistrationPresenter : BasePresenter
{
    private readonly ISelfRegistrationView view = null;
    public SelfRegistrationPresenter(ISelfRegistrationView view) { this.view = view; }

    public void RegisterNewUser()
    {
        try 
        {
            UserBusinessService service = new UserBusinessService();
            service.NewUserSelfRegistration(this.view.FirstName, 
                this.view.LastName, this.view.EmailAddress, this.view.Password, 
                this.view.CreditCardNumber, this.view.CreditCardType, this.view.CreditCardExpirationDate);
        } 
        catch(Exception e)
        {
            base.HandleError(e);
        }
    }
}