【问题标题】:How to use ASP Identity with Generic Repository and UoW Patterns in MVC Application如何在 MVC 应用程序中使用具有通用存储库和 UoW 模式的 ASP 标识
【发布时间】:2017-06-26 15:16:55
【问题描述】:

我在我的 MVC 应用程序中使用通用存储库和 UoW 模式。它很适合我的要求。但是,由于 ASP Identity 与 MVC 的紧密耦合,我发现将 ASP Identity 与这些模式集成非常困难。我的代码如下:

// 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 与上述结构集成。

提前致谢。

【问题讨论】:

标签: entity-framework asp.net-identity repository-pattern asp.net-mvc-5


【解决方案1】:

简短的回答 - 你不要这样做。

长答案:默认模板为您提供了一个有效的解决方案,所有部分都可以很好地协同工作。为什么要费心将工作解决方案纳入您的架构,尤其是您意识到您的架构不适合 Identity 解决的问题。

存储库和 UoW 模式很好,但不适用于身份。身份处理身份验证、cookie、角色、权限。存储库是关于持久化数据的,UoW 是关于事务的。这些东西不适合彼此。所以不要试图将圆钉插入方孔。

【讨论】:

  • trailmax,那么如何将 Identity 与我的应用程序集成。在我的结构中,只能通过 Repository 访问 DbContext,但另一方面,Identity 与 DbContext 紧密耦合。唯一的解决方案是将身份代码移出到自己的存储库中。
  • 您使用的是DI,对吗?好吧,将DbContext 注入IUserStore - 这是唯一需要它的地方(大部分),而身份的其余部分正在通过ApplicationUserManagerApplicationRoleManager 工作(如果你有的话)。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多