0

次のような各サービスに異なるインターフェイスを配置するフレームワークを検討しています。

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 を使用していますが、そのために多大な労力を費やしていませんか? このアプローチを実装するより良い方法はありますか?

4

0 に答える 0