Выполнял тестовое задание при поиске работы. Результат моей работы никому не понравился, поэтому прошу помочь с разбором.
Суть такова: написать приложение которое выводит список компаний и список сотрудников выбранной компании. У каждого сотрудника есть ФИО, адрес, тел, должность. Реализовать добавление/удаление сотрудника и компании, редактирование. Все сохранять в базе данных SQLite, использовать NHibernate, WPF, паттерны MVVM, IOC.
Кратко что сделал я:
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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Можно ли как-то удалить объект superA, чтобы все ссылки из массива стали автоматически указывать на null?
Собственно вопрос, для чего они нужны и когда может потребоваться генерить их ручками в коде?
Разрабатываю сервер на C#У меня есть интерйфейс, и вся основная сетевая работа выполняется в отдельном потоке
У меня вопросКак мне с помощью C# создать к примеру текстовый документ по определенному шаблону, и отправить его на печать, заменяя переменные...