1. Pytanie, czy dobrze skonfigurowałem Autofac. Początkowo podpinałem tylko klasy oparte na interfejsach, ale po namyśle postanowiłem wszystko przekazywać przez konstruktor. Zastanawia mnie tylko, jak przekazać ViewModel prosto do widoku. I czy widok powinien jako jedyny być tworzony operatorem new (niestety nie mam żadnego kontrolera/presentera, aplikacja jest oparta na MVVM). Finalnie już w mainie pobierany jest resolverem ViewModel, żeby zaraz go wstrzyknąć.
static class Program
{
private static IContainer Container { get; set; }
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var builder = new ContainerBuilder();
builder.RegisterType<BackwardChainingTemperamentService>().As<IBackwardChainingTemperamentService>();
builder.RegisterType<TemperamentViewModel>().As<TemperamentViewModel>();
builder.RegisterType<UserTemperament>().As<UserTemperament>();
Container = builder.Build();
using (var scope = Container.BeginLifetimeScope())
{
var viewModel = scope.Resolve<TemperamentViewModel>();
Application.Run(new TemperamentView(viewModel));
}
}
}
}
2. Czy w serwisach biznesowych powinny znajdować się jakiekolwiek komunikaty, które potem można przekazać do grida? Na zasadzie:
/// serwis
private bool IsUserMelancholic(bool IsUserApathetic, bool IsUserPessimistic, bool IsUserUnsociable)
{
Message = null;
if ((IsUserApathetic && IsUserPessimistic) || (IsUserApathetic && IsUserUnsociable) || (IsUserPessimistic && IsUserUnsociable))
{
Message = "Użytkownik jest melancholikiem";
PushMessageToGrid();
return true;
}
Message = "Użytkownik nie jest melancholikiem";
PushMessageToGrid();
return false;
}
// viewModel
public void Conclude(string hypothesis, UserTemperament model)
{
TemperamentEnum enumValue;
Enum.TryParse<TemperamentEnum>(hypothesis, out enumValue);
switch (enumValue)
{
case TemperamentEnum.Neurotic:
Service.IsUserNeurotic(model);
break;
case TemperamentEnum.Balanced:
Service.IsUserBalanced(model);
break;
case TemperamentEnum.Extravert:
Service.IsUserExtroverted(model);
break;
case TemperamentEnum.Introwert:
Service.IsUserIntrovert(model);
break;
}
}
Czy raczej powinny to być tylko informacje w postaci boola, które z kolei obrabiane są w ViewModelu i przekazywane do widoku na podstawie prawdy/fałsz? Muszę przeprowadzić wnioskowanie wstecz i żeby sprawdzić hipotezę (np. "Użytkownik jest melancholikiem"), po drodze muszę sprawdzić jeszcze pozostałe metody i wyświetlić ich komunikaty (np. "Użytkownik jest aspołeczny", "Użytkownik ma stany depresyjne"). Potem kroki wnioskowania wyświetlane są na głównej liście w widoku. Problem w tym, że ViewModel wywołuje wyłącznie metodę IsUserMelancholic, która zwraca pojedynczy true/false. Co za tym idzie, z poziomu ViewModelu nie jestem w stanie ustalić, co zwróciły pozostałe metody i jaką wiadomość zaagregować na gridView. Sprawę uprościłem i wrzuciłem te wiadomości prosto do serwisów, które przez event PushMessageToGrid agregują je na listę, ale mam obawy, na ile jest to spójne rozwiązanie.