0

MVCアプリケーションで汎用リポジトリとUoWパターンを使用しています。私の要求にはうまくいきます。しかし、ASP IDとMVCとの緊密な結合のため、これらのパターンとASP IDを統合することは非常に困難です。私のコードは以下の通りです:MVCアプリケーションで汎用リポジトリとUoWパターンでASP IDを使用する方法

// Repository Interface 
public interface IRepository<TEntity> where TEntity : class 
{ 
     TEntity Get(int id); 
     IEnumerable<TEntity> GetAll(); 
     IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate); 
     void Add(TEntity entity);   
     void Remove(TEntity entity); 
} 

// Repository class 
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
     // db context defined 
     // IRepository implementation 
} 

// Domain Class 
public class Author 
{ 
     public int AuthorId { get; set; } 
     public string Name { get; set; } 
} 

// DbContext class 
public class AppContext : DbContext 
{ 
     public AppContext() : base("name=MyContext") {} 
     public virtual DbSet<Author> Authors { get; set; } 
} 

// Domain Interface 
public interface IAuthorRepository : IRepository<Author> 
{ // implement custom methods } 

// Concrete class implementation 
public class AuthorRepository : Repository<Author>, IAuthorRepository 
{ 
     public AuthorRepository(AppContext context) : base(context) 
     {} 

     public AppContext AppContext 
     { 
      get { return Context as AppContext; } 
     } 
} 

// UnitOfWork interface 
public interface IUnitOfWork : IDisposable 
{ 
     IAuthorRepository Authors { get; } 
     int Complete(); 
} 

// Unit of work class 
public class UnitOfWork : IUnitOfWork 
{ 
    private AppContext context; 

     public UnitOfWork(AppContext context) 
     { 
      this.context = context; 
      Authors = new AuthorRepository(context); 
     } 

     public IAuthorRepository Authors { get; set; } 

     public int Complete() 
     { 
      return context.SaveChanges(); 
     } 

     // dispose context 
} 

public class HomeController : Controller 
{ 
     private readonly IUnitOfWork uow; 

     public HomeController(IUnitOfWork uow) // using Dependency Injection 
     { 
      this.uow = uow; 
     } 

     public ActionResult Index() 
     { 
      var authors = uow.Authors.GetAll(); 
      return View(authors); 
     } 
} 

上記の構造とASP Identityをどのように統合できるかについての私の指摘はありますか?

ありがとうございます。

+0

[リポジトリと作業単位でのASP.NET ID]の可能な複製(https://stackoverflow.com/questions/23226140/asp-net-identity-with-repository-and-unit-of-work) –

答えて

0

短い答え - これはしないでください。

長い回答:デフォルトのテンプレートは、すべてのビットがうまく連携して動作するソリューションを提供します。なぜあなたのアーキテクチャーにワーキング・ソリューションを抱かせるのか、特にアイデンティティによって解決される問題にあなたのアーキテクチャーが適合しないことが分かっている。

リポジトリとUoWパターンは良好ですが、アイデンティティではありません。アイデンティティは、認証、クッキー、ロール、権限を扱います。リポジトリはトランザクションに関するデータを保持しています。これらのものはお互いに適合しません。だから、正方形の穴に丸いペグをはめ込もうとしないでください。

+0

trailmaxの場合、アイデンティティとアプリケーションをどのように統合するのですか?私の構造では、DbContextはリポジトリを介してのみアクセスできますが、IdentityはDbContextと緊密に結合されています。唯一の解決策は、アイデンティティコードを独自のリポジトリに移動することです。 – Tech

+0

DIを使用しています、そうですか? 'IUserStore'に' DbContext'を注入します。これは、(それが必要な場合)唯一必要な場所です。Identityの残りの部分は、 'ApplicationUserManager'と' ApplicationRoleManager'(もしあれば)を使って作業しています。 – trailmax