Я только начал изучать .NET 3.5, поэтому, пожалуйста, прости меня, если этот тип вопросов задавался ранее. Я борюсь с достойным использованием методов расширения, потому что я только что загрузил suteki shop, предложение электронной коммерции MVC. В этом проекте есть довольно стандартный шаблон репозитория, который расширяет IRepository.
Для расширения основных функций, предоставляемых этим интерфейсом, используются методы расширения, т. Е .:
.
public static class CategoryRepositoryExtensions
{
public static Category GetRootCategory(this IRepository<Category> categoryRepository)
{
return categoryRepository.GetById(1);
}
}
Теперь все это хорошо, но Интерфейсы, на мой взгляд, действуют как контракты с объектами, которые их реализуют.
Тот факт, что хранилище было сопряжено, предполагает попытку подхода, независимого от уровня данных. Тем не менее, если бы я создавал свой собственный слой данных, я бы не понял, какие методы расширения мне нужно будет создать, чтобы убедиться, что я выполнил свое контрактное требование к классам, которые реализуют мои классы репозитория.
Кажется, что более старый способ создания IRepository, а затем расширения, который позволяет гораздо лучше видеть то, что требуется, например,
ICategoryRepoitory : IRepository<Category>
{
Category GetRootCategory();
}
Так что я предполагаю, что мой вопрос заключается в том, что использование методов Extention кажется кому-то неправильным? Если нет, то почему? Разве я не должен стонать об этом?
EDIT:
Приведенный выше пример действительно является хорошим примером того, почему методы расширения могут быть очень полезны.
Полагаю, моя проблема в том, застряли ли конкретные реализации доступа к данным в методе расширения в сборке механизмов доступа к данным.
Таким образом, если бы я сменил его на другой механизм, мне пришлось бы создать аналогичный метод расширения в этой сборке.