Мы создаем настольное приложение для Windows (не на веб-основе) и пытаемся найти лучший способ реализации репозитория и шаблона UnitOfWork.
В типичном приложении Asp.Net Mvc ваши репозитории внедряются с контекстом данных, сервисы внедряются с репозиториями, и, наконец, контроллеры внедряются с сервисами, и все хорошо, если вы не нажмете ни одного исключения, вы совершитеперемены.
В приложениях windows form / wpf не рекомендуется использовать один текстовый текст данных ( Oren имеет сообщение об этом в MSDN), поэтому мы решили создать контекст данных у докладчика.Мы используем Linq2SQl, и у нас есть две разные базы данных для работы на основе представления.
В настоящее время у меня есть следующая реализация
public interface IRepository<T> where T : class
{
IEnumerable<T> Find(Expression<Func<T, bool>> where);
T Single(Expression<Func<T, bool>> where);
...
}
public class Repository<T> : IRepository<T> where T : class
{
private readonly Table<T> _table;
public Repository(DataContext dataContext)
{
_table = dataContext.GetTable<T>();
}
}
public Class TodoService :ITodoService
{
IRepository<Todo> _todoRepository;
public TodoService(DataContext dataContext)
{
_todoRepository = new Repository<Todo>(dataContext)
}
...
}
}
// Presenter for UI
public class TodoPresenter
{
public void Save()
{
Using (DataContext dataContext = DataContextFactory.GetNewContextForDatabase1())
{
ITodoService service = new TodoService(dataContext);
...
service.Save(..);
dataContext.SubmitChanges();
}
}
}
Я хотел бы отделить докладчика от службы и хотел бы внедрить TodoService, когда запрашивается ITodoService, но я не могу внедрить контекст данных по двум причинам, так как я должен принять решение на основе базы данных или даже не могу поддерживать контекст данных в приложениина уровне, даже если у нас есть только одна база данных, являющаяся приложением Windows (многие представления открываются одновременно как вкладки в приложении), и без контекста данных я не могу создавать классы репозитория и не может внедрять сервисы.
Любая идея о том, как добиться развязки в этой ситуации