, . , , , , GUI. , ( ):
1) , , . new View().Start();
public interface IPresenter<V>
{
V View { get; set; }
}
public interface IView<P>
{
P Presenter { get; }
}
public static class PresenterFactory
{
public static P Presenter<P>(this IView<P> view) where P : new()
{
var p = new P();
(p as dynamic).View = view;
return p;
}
}
public interface IEmployeeView : IView<EmployeePresenter>
{
void OnSave();
}
public class EmployeePresenter : IPresenter<IEmployeeView>
{
public IEmployeeView View { get; set; }
public void Save()
{
var employee = new EmployeeModel
{
Name = View.Bla
};
employee.Save();
}
}
class EmployeeView : IEmployeeView
{
public EmployeePresenter Presenter { get; }
public EmployeeView()
{
Presenter = this.Presenter();
}
public void OnSave()
{
Presenter.Save();
}
}
, , . - :
public interface IPresenter<P, V> where P : IPresenter<P, V> where V : IView<P, V>
{
V View { get; set; }
}
public interface IView<P, V> where P : IPresenter<P, V> where V : IView<P, V>
{
P Presenter { get; }
}
public static class PresenterFactory
{
public static P Presenter<P, V>(this IView<P, V> view)
where P : IPresenter<P, V>, new() where V : IView<P, V>
{
return new P { View = (V)view };
}
}
public interface IEmployeeView : IView<EmployeePresenter, IEmployeeView>
{
}
public class EmployeePresenter : IPresenter<EmployeePresenter, IEmployeeView>
{
}
:
IEmployeeViewPresenterFactory PresenterFactory this- ,
- ,
new EmployeeView()...
2) . new Presenter().Start();
(, 1) , .
public abstract class IPresenter<V> // OK may be a better name here
{
protected V View { get; }
protected IPresenter()
{
View = ...;
(View as dynamic).Presenter = this;
}
}
public interface IView<P>
{
P Presenter { get; set; }
}
public interface IEmployeeView : IView<EmployeePresenter>
{
void OnSave();
}
public class EmployeePresenter : IPresenter<IEmployeeView>
{
public void Save()
{
var employee = new EmployeeModel
{
Name = View.Bla
};
employee.Save();
}
}
class EmployeeView : IEmployeeView
{
public EmployeePresenter Presenter { get; set; }
public void OnSave()
{
Presenter.Save();
}
}
:
IEmployeeView- ,
- ,
new EmployeePresenter(...
3) ,
( ), , 1, ( ), 2, , , . :
public abstract class IPresenter<V> where V : IView
{
protected V View { get; }
protected IPresenter()
{
View = ...;
WireEvents();
}
protected abstract void WireEvents();
}
public interface IEmployeeView : IView
{
event Action OnSave;
}
public class EmployeePresenter : IPresenter<IEmployeeView>
{
protected override void WireEvents()
{
View.OnSave += OnSave;
}
void OnSave()
{
var employee = new EmployeeModel
{
Name = View.Bla
};
employee.Save();
}
}
class EmployeeView : IEmployeeView
{
public event Action OnSave;
void OnClicked(object sender, EventArgs e)
{
OnSave();
}
}
:
:
IEmployeeView- , iview
- , iview
- ,
new EmployeePresenter()...
. , #, , , . , ! , , .NET (, Form of WinForms) . , . , # IEmployeeView , , IEmployeeView , (. IEmployeeView EmployeeView ). , #, , .
4)
.
public interface IEmployeeView
{
void OnSave();
}
public static class EmployeePresenter
{
public void Save(this IEmployeeView view)
{
var employee = new EmployeeModel
{
Name = view.Bla
};
employee.Save();
}
}
class EmployeeView : IEmployeeView
{
public void OnSave()
{
this.Save();
}
}
:
:
IEmployeeView- ,
this.... this.... - , View...
2 3 .