0

現在、ASP.NET MVC を使用して典型的な 3 層 Web アプリを構築しています。以下のように依存性注入(Autofac)で設定しました:

public class UserController : BaseController
{
    private readonly IUserService _userService;
    public UserController(IUserService userService)
    {
        this._userService = userService;
    }
}

public class IUserService
{
    void InsertUser(User user);
    void UpdateUser(User user);
    void DeleteUser(User user);
}
public class UserService : IUserService
{
    private readonly IRepository<User> _userRepository;
    public UserService(IRepository<User> userRepository)
    {
        this._userRepository = userRepository;
    }
    public void InsertUser(User user)
    {
        _userRepository.Insert(user);
    }
    public void UpdateUser(User user)
    {
        _userRepository.Update(user);
    }
    public void DeleteUser(User user)
    {
        _userRepository.Delete(user);
    }
}

リポジトリは、EF を使用した一般的な汎用リポジトリです。

public interface IRepository<T> where T : BaseEntity
{
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);
}

問題は、アプリに多数のエンティティがあり、エンティティごとに、サービス レイヤーで CRUD 操作のために上記のコードを複製する必要があることです。例: エンティティ "Role" の場合、"InsertRole"、"UpdateRole"、"DeleteRole"... など、他のエンティティにはさらに多くのエンティティがあります。そこで、以下のように STATIC METHOD を使用して CRUD 操作を STATIC CLASS "CommonService" に抽出することで、重複するコードを削除するようにリファクタリングしようとしました。

public static class CommonService
{
    public static void Insert<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Insert(entity);
    }
    public static void Update<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Update(entity);
    }
    public static void Delete<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Delete(entity);
    }
}

このクラスを使用して、CRUD 操作のために使用中の重複コードを削除します。Controller では、CommonService.Insert(user); を呼び出すだけです。通常どおり別のサービス メソッドがあり、CRUD の重複はありません。しかし、単体テストを除いて、このアプローチにマイナス面があるかどうか疑問に思っています (CRUD の単体テストは行いません)。Web環境(ASP.NET MVC)でのメモリ管理や同時実行処理に問題はありませんか? EF を使用したデータ処理の同時実行メカニズムをまだ実装していません (エンティティの同時更新...)

前もって感謝します!ミルドル。

4

2 に答える 2

0

私はこれが非常に古いことを知っていますが、これに出くわしたばかりで、その静的実装を取得して抽象クラス (BaseService のようなもの) にしないのはなぜだろうかと考えています。そうすれば、メソッドの単一の実装を作成して、言及したすべての重複コードを削除できますが、特定のエンティティが特別な処理を必要とする場合は、特定のサービス実装ごとに処理できます。

于 2020-12-28T17:14:38.527 に答える