У вас происходит много вещей, которые не имеют большого смысла.
Прежде всего, имена свойств всегда должны быть существительными (в единственном или множественном числе) или глаголом "существо", подобным Is * или Has *. Это свойства объекта, и они должны быть похожи на то, что вы сказали бы в ответ на вопрос типа «Не могли бы вы описать свой стол?» Execute
- это операция, и поэтому она должна быть методом. Аналогично, ваши соглашения об именах в Версии 1 должны быть PascalCased, что означает отсутствие подчеркиваний, и первая буква всех слов должна быть заглавной. Это не несгибаемые истины, но они считаются ООП общими стандартами кодирования C #.
Во-вторых, код вашего основного метода на самом деле ничего не реализует в вашем обобщенном классе. Единственное, что на самом деле делает ваш класс, - это создание экземпляра CustomerDataAccess
. Метод Save()
ничего не будет делать, если только вы конкретно не сможете вызвать item.Save()
Чтобы использовать функциональность «Сохранить, обновить, удалить» в вашем универсальном классе, ваш класс CustomerDataAccess
должен будет реализовать интерфейс, ожидаемый ваш общий класс. Например:
public interface IDataAccess<T> : where T : YourBaseObject {
public void Update(T item);
public void Save(T item);
public void Remove(T item);
}
public class Customer : YourBaseObject {
public int CustomerID { get; set; }
public string EmailAddress { get; set; }
public int Age { get; set; }
}
public class CustomerDataAccess :
DataRespository<IDataAccess<Customer>> {
public void PerformCustomerOnlyAction(Customer customer) {
/* do stuff */
}
}
Теперь вы можете создать универсальный класс, который обрабатывает базовые функции CRUD, а все остальные функции доступны через свойство BaseRepository.
/* e.g. T = IDataAccess<Customer>, K = Customer */
public class DataRespository<T>
where T : IDataAccess<K>, new()
where K : YourBaseObject, new()
{
private T _base;
public T BaseRepository {
get {
if(_base == null)
_base = Activator.CreateInstance<T>();
return _base;
}
}
public void Update(K item) { /* functionality for YourBaseObject */ }
public void Save(K item) { /* functionality for YourBaseObject */ }
public void Remove(K item) { /* functionality for YourBaseObject */ }
}
class Program
{
static void Main(string[] args)
{
var repository = new CustomerDataAccess();
Customer c = new Customer {
Age = 10,
EmailAddress = "this@demo.com"
};
repository.Save(c);
// This pass-through is no longer needed, but shown as example
// repository.BaseRepository.PerformCustomerOnlyAction(c);
repository.PerformCustomerOnlyAction(c);
}
}
ПРИМЕЧАНИЕ Я сделал вышеупомянутый код с нуля / памяти. Ограничения универсального типа могут работать не совсем так, как они у меня.
ASP.NET 3.5 Unleashed от Стивена Уолтера состоит из нескольких глав по созданию шаблона репозитория, который настроен аналогично тому, что вы пытаетесь выполнить в Версии 2. Он также разделяет обработку между уровень бизнес-логики и уровень доступа к данным. Хотя книга огромна (почти 2000 страниц) и многие примеры кода являются избыточными или лучше оставить их как часть компакт-диска, он достаточно глубоко разбирается в диапазоне от начального до среднего уровня. Он доступен на Amazon примерно за 25 долларов.