Konfiguracja autofac i wymiana danych na linii viewmodel-serwis

Konfiguracja autofac i wymiana danych na linii viewmodel-serwis
darkrat
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 203
0

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ąć.

Kopiuj
 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:

Kopiuj
       /// 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;
        }
Kopiuj
// 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.

neves
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1114
1
  1. A ktoś Cię zmusza do używania typu prostego bool jako zwracanego z tej metody? Skoro metoda ma zwracać więcej rzeczy utwórz sobie nowy typ (IsUserMelancholicResult) który będzie zawierał wszystkie potrzebne rzeczy, czyli tego boola + komunikaty, i jego instancje zwracaj z tej metody.
darkrat
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 203
0

W takim razie widzę to tak: utworzyć property zawierające listę stringów. String ten jest dodawany przy każdej metodzie. Dane na liście są uzupełniane chronologicznie, więc nie byłoby komplikacji z wyświetlaniem. I każda z tych głównych metod mogłaby być typu List<string>, przez co zwracałaby kolejne kroki wnioskowania. Cały czas się jednak zastanawiam, czy serwis zwracający listę stringów do ViewModelu jest dobrym rozwiązaniem (ewentualnie przesadzam z oddzielaniem prezentacji od logiki).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.