アプリケーションを構築する方法について、フィードバック/ヘルプが必要でした。私の現在のソリューション構造は次のようになります。
- UI (実際の MVC アプリケーション)
- コア (コントローラーとビューモデルのみ)
- サービス
- BLL
- データ (ドメイン オブジェクトにマップされたエンティティ フレームワーク DbContext)
- ドメイン (単純な POCO オブジェクト)
- インターフェース
他のもの
- DbContext を Controller に注入するための Ninject (リクエストごと)
- Domain オブジェクトを ViewModel にマップする AutoMapper
すべてのアセンブリには、Interfaces プロジェクトへの参照があります。これは、名前が示すように、単純なインターフェイス (つまり、IDbContext、IRepository など) にすぎません。
Services プロジェクトは、他のすべてのものを「結びつける」ものです。これは、データ アクセス層 (Entity Framework) への直接参照を持つ唯一のアセンブリです。
以下にいくつかのコードを提供しました。
コントローラーの例は次のようになります。
namespace Core.Controllers
{
public class HomeController : Controller
{
private IDbContext dbContext;
public HomeController(IDbContext dbContext)
{
this.dbContext = dbContext;
}
public ActionResult Users()
{
UserService userService = new UserService(dbContext);
var users = userService.GetAllUsers();
return View(Mapper.Map<IEnumerable<UserListViewModel>>(users));
}
...
UserService クラス:
namespace Services
{
public class UserService
{
private readonly IDbContext dbContext;
public UserService(IDbContext dbContext)
{
this.dbContext = dbContext;
}
public IEnumerable<User> GetAllUsers()
{
IRepository<User> userRepository = new Repository<User>(dbContext);
UserBLL userBLL = new UserBLL(userRepository);
return userBLL.GetAllUsers();
}
...
最後に、ビジネス層クラス:
namespace BLL
{
public class UserBLL
{
private readonly IRepository<User> userRepository;
public UserBLL(IRepository<User> userRepository)
{
this.userRepository = userRepository;
}
public IEnumerable<User> GetAllUsers()
{
return userRepository.Get();
}
...
フィードバックや改善方法を探しています。基本的なタスクについては、サービス層のメソッドがビジネス層のメソッドとまったく同じになることに気付きました (つまり、「パススルー」機能)。私が望んでいるのは、この抽象化が、複数のビジネス層メソッドの呼び出しを必要とする可能性のあるより複雑なタスクに役立つことです。サービス層にビジネス ロジックを含めたほうがよいのでしょうか。