次のような各サービスに異なるインターフェイスを配置するフレームワークを検討しています。
public interface ICategoryService
{
Category GetCategoryById(int categoryId);
void InsertCategory(Category category);
void UpdateCategory(Category category);
void DeleteCategory(Category category);
IPagedList<Category> GetAllCategories(string categoryName = "",
int pageIndex = 0, int pageSize = int.MaxValue, bool showHidden = false);
...
}
public class CategoryService : ICategoryService
{
public virtual void DeleteCategory(Category category)
{
if (category == null)
throw new ArgumentNullException("category");
category.Deleted = true;
UpdateCategory(category);
}
public virtual void InsertCategory(Category category)
{
if (category == null)
throw new ArgumentNullException("category");
_categoryRepository.Insert(category);
}
public virtual void UpdateCategory(Category category)
{
if (category == null)
throw new ArgumentNullException("category");
var parentCategory = GetCategoryById(category.ParentCategoryId);
while (parentCategory != null)
{
if (category.Id == parentCategory.Id)
{
category.ParentCategoryId = 0;
break;
}
parentCategory = GetCategoryById(parentCategory.ParentCategoryId);
}
_categoryRepository.Update(category);
}
...
}
各エンティティには、CRUD 操作を行う 1 つのリポジトリがあり、これらのリポジトリを使用していくつかのビジネス操作を行うサービスもあります。また、IOC コンテナーを使用してこれらの依存関係を解決します。
サービスを見てみると、似たようなメソッドと同じ実装がいくつかあります。では、なぜ抽象ベース サービスを使用せず、それを継承して同様の操作を実行しないのでしょうか。
public abstract class BaseService<T> where T : BaseEntity
{
void Insert(T t)
{
//do some implementation
}
void Update(T t)
{
//do some implementation
}
...
}
テストと抽象化の目的で Interface を使用していますが、そのために多大な労力を費やしていませんか? このアプローチを実装するより良い方法はありますか?