Помогите с разбором тестового задания C#, wpf, nhibernate, ioc, mvvm

171
07 мая 2018, 21:45

Выполнял тестовое задание при поиске работы. Результат моей работы никому не понравился, поэтому прошу помочь с разбором.

Суть такова: написать приложение которое выводит список компаний и список сотрудников выбранной компании. У каждого сотрудника есть ФИО, адрес, тел, должность. Реализовать добавление/удаление сотрудника и компании, редактирование. Все сохранять в базе данных SQLite, использовать NHibernate, WPF, паттерны MVVM, IOC.

Кратко что сделал я:

  • Реализовал классы Employee и Company, для каждого из них соответственно EmployeeViewModel и CompanyViewModel;
  • Список сотрудников с их данными и список компаний вывожу в два DataGrid, поэтому реализовал универсальный шаблон ViewModelCollection, так для одного списка получается ViewModelCollection<EmployeeViewModel, Employee>() полный текст шаблона ViewModelCollection<>. Этот класс связывает коллекцию моделей с view, пробрасывает уведомления CollectionChanged во view и обратно, для хранения коллекций моделей завел классы CompanyPool и EmployeePool, соответственно для хранения списка компаний и списка сотрудников выбранной компании.

Теперь реализация шаблона Invertion of control так как ее понял я:

  • Завел два интерфейса для списка сотрудников и списка компаний, ICompanyDomain, IEmployeeDomain, (все время хотелось что-нибудь объединить, но что-то не додумался как сделать единый интерфейс для двух списков, а может оно и не надо было):

    interface ICompanyDomain
    {
    void Add(Company company);
    void Update(Company company);
    void Remove(Company company);
    ICollection<Company> Load();
    }

Работает это так - класс CompanyPool содержит ссылку на интерфейс ICompanyDomain, через который загружает и редактирует список компаний когда надо, а вся реализация интерфейса содержится в классе DBCompanyDomain, этот класс уже через NHibernate работает с базой данных. Интерфейсы и их реализации

А вот какой код класса MainWindow получился:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();          
    }
    private void dataGridCompanies_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Company company;
        if (dataGridCompanies.SelectedItem != null)
        {
            try
            {
                //получаем ссылку на выбранную компанию
                company = (dataGridCompanies.SelectedItem as IViewModel<Company>).GetModel();
                //загружаем список сотрудников выбранной компании
                dataGridEmployees.DataContext = new ViewModelCollection<EmployeeViewModel, Employee>(EmployeePool.Instance.GetEmployeeList(company.Id));
            }
            catch (Exception ex)
            {
                //на случай если в таблице был выбран PlaceHolder
            }
        }
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //-------- Подключение к БД --------------------
        //-- настройки подключения в файле hibernate.cfg.xml
        var cfg = new Configuration();
        cfg.Configure();
        var sessions = cfg.BuildSessionFactory();
        // ----------- Создаем и привязываем домены для работы с базой данных --------------------
        EmployeePool.Instance.employeesDomain = new DBEmployeeDomain(sessions.OpenSession());
        CompanyPool.Instance.companiesDomain = new DBCompanyDomain(sessions.OpenSession());
        //------------ загружаем список компаний, связываем его с ViewModel а ViewModel с View
        dataGridCompanies.DataContext = new ViewModelCollection<CompanyViewModel, Company>(CompanyPool.Instance.GetCollection());
    }
}

Весь код проекта тут (visual studio 2017): https://github.com/MicroKoder/WPFTestApp

READ ALSO
Возможно ли удалить объект, на который ссылаются одновременно несколько ссылок? - C#

Возможно ли удалить объект, на который ссылаются одновременно несколько ссылок? - C#

Можно ли как-то удалить объект superA, чтобы все ссылки из массива стали автоматически указывать на null?

133
Для чего нужны деревья выражений?

Для чего нужны деревья выражений?

Собственно вопрос, для чего они нужны и когда может потребоваться генерить их ручками в коде?

186
C# Повторный запуск потоков

C# Повторный запуск потоков

Разрабатываю сервер на C#У меня есть интерйфейс, и вся основная сетевая работа выполняется в отдельном потоке

200
Замена текста и печать в C#

Замена текста и печать в C#

У меня вопросКак мне с помощью C# создать к примеру текстовый документ по определенному шаблону, и отправить его на печать, заменяя переменные...

170