現在、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 を使用したデータ処理の同時実行メカニズムをまだ実装していません (エンティティの同時更新...)
前もって感謝します!ミルドル。