Я создаю интерфейс по шаблону Unit of Work. Мой интерфейс выглядит так:
public interface IDataContext : IDisposable
{
void SaveChanges();
TSource Create<TSource>(TSource toCreate) where TSource : class;
TSource Update<TSource>(TSource toUpdate) where TSource : class;
bool Delete<TSource>(TSource toDelete) where TSource : class;
IQueryable<TSource> Query<TSource>();
}
Пока все хорошо. Теперь я реализую это на своем уровне данных, который использует EF4 в качестве поставщика данных. Я придумал этот код для метода «Query», но я думаю, что он не очень чистый, я чувствую, что есть умный способ сделать это, но я не могу понять.
public IQueryable<TSource> Query<TSource>()
{
var type = typeof(TSource);
IQueryable item = null;
if (type == typeof(Activity)) item = _entities.ActivitySet;
if (type == typeof(Company)) item = _entities.CompanySet;
if (type == typeof(Phase)) item = _entities.PhasesSet;
if (type == typeof(Project)) item = _entities.ProjectSet;
if (type == typeof(ProjectState)) item = _entities.ProjectStateSet;
if (type == typeof(ProjectType)) item = _entities.ProjectTypeSet;
if (type == typeof(User)) item = _entities.UserSet;
if (type == typeof(UserType)) item = _entities.UserTypeSet;
if (item != null) return item as IQueryable<TSource>;
throw new NotImplementedException(string.Format("Query not implemented for type {0}", type.FullName));
}
Проблемы, которые я вижу здесь, заключаются в том, что все IF проверяются каждый раз, хотя я мог бы связать их в каскадном режиме, если все-таки, но все равно выглядит для меня довольно ужасно. Другая проблема заключается в том, что мне приходится вручную добавлять одну строку для каждой новой сущности, которая может быть добавлена, но это не моя главная задача.
У кого-нибудь есть хороший совет по этому поводу? Спасибо.