Я пытаюсь добиться слабой связи приложения winfrom с инъекцией зависимостей с помощью MVP Design Я новичок в принципе DI, поэтому я пытаюсь найти пример, чтобы помочь мне и я узнал, что проект https://github.com/anastasioszampelis/ArchitecturalPatternsDesktop/tree/main/Todo.Shared нет, у меня небольшая проблема, когда я пытаюсь назначить свойство презентатора своему представлению и использовать его для управления поведением представления
SignUpView
public partial class SignUpForm : BaseInfoForm , ISignUp{
public SignUpPresenter SignUpPresenter { private get; set; }
public SignUpForm()
{
InitializeComponent();
}
public void DisplayForm()
{
this.Show();
}
private void btn_SignUpClick(object o, EventArgs e)
{
if (HasInput && IsInputValid)
//.NullReferenceException
SignUpPresenter.SignUpEmployee();
}
}
и этот интерфейс ISignUp со свойством Presenter
namespace EmployeeManagement.ViewInterface
{
public interface ISignUp : IInfo
{
SignUpPresenter SignUpPresenter { set; }
}
}
а здесь SignUpPresenter
public class SignUpPresenter
{
private readonly IRepository repository;
private readonly ISignUp view;
private Employee employee;
public SignUpPresenter(IRepository repository,ISignUp SignUp)
{
if (repository == null) throw new ArgumentNullException("Repository");
if (SignUp == null) throw new ArgumentNullException("ISignUp");
view = SignUp;
view.SignUpPresenter = this;
this.repository = repository;
}
а здесь DIConfiguration
public class DIBootStrapper
{
public static void ConfigureDI()
{
var host = new HostBuilder()
.ConfigureServices((context, services) =>
{
services.AddSingleton<IRepository, SqlRepository>();
services.AddSingleton<ILogin, LoginForm>();
services.AddTransient<LoginPresenter>();
services.AddSingleton<ISignUp, SignUpForm>();
services.AddTransient<SignUpPresenter>();
//TODO IPresenter
/*services.AddTransient(servicrProvider => new Lazy<ISignUpPresenter>(()
=> servicrProvider.GetRequiredService<ISignUpPresenter>()));*/
}).Build();
using(var serviceScope = host.Services.CreateScope())
{
var services = serviceScope.ServiceProvider;
try
{
var loginPresenter = services.GetRequiredService<LoginPresenter>();
var SignUpPresenter = services.GetRequiredService<SignUpPresenter>();
// Debug.WriteLine("services "+SignUpPresenter.ToString());
loginPresenter.DisplayForm();
System.Windows.Forms.Application.Run();
}
catch(Exception ex)
{
Debug.WriteLine(ex.Message,"Boot Strapper M ");
Debug.WriteLine(ex.StackTrace, "Boot Strapper ST ");
}
}
}
}
Я не знаю, что сделал не так, чтобы получить нулевую подписку на презентацию я думаю ошибка в DIConfiguration * обратите внимание, что LoginPresenter как моя точка входа работает нормально
services.AddSingleton <ILogin, LoginForm> (); services.AddTransient <LoginPresenter> ();
Привет, Абануб, я не уверен, что вы думаете, что делает этот код, но он ничего не присваивает никакому свойству, потому что MS.DI не выполняет инъекцию свойств.
я хотел сказать это services.AddSingleton <ILogin, LoginForm> (); services.AddTransient <LoginPresenter> (); плюс этот var loginPresenter = services.GetRequiredService <LoginPresenter> (); заставил loginPresenter работать правильно, я подумал, что могу сделать то же самое для SignUp Presenter, если вы, пожалуйста, предоставьте мне пример, чтобы правильно понять ситуацию, потому что я просто копирую проект, у меня была ссылка выше *) обратите внимание, я прочитал большую часть ур книга, но я не смог найти пример для Winforms





Пожалуйста, покажите код, в котором вы фактически назначать свойство
SignUpPresenterвашего классаSignUpForm. Если этот код не существует, это будет ваша проблема, потому что контейнер MS.DI не будет выполнять инъекцию свойств за вас. Попробуйте вместо этого переместитьSignUpPresenterв конструкторSignUpForm.