首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Microsoft.AspNetCore.Identity.MongoDB用于多租户。如何将动态租户注入MongoDbContext

将Microsoft.AspNetCore.Identity.MongoDB用于多租户。如何将动态租户注入MongoDbContext
EN

Stack Overflow用户
提问于 2018-02-09 22:16:12
回答 1查看 1K关注 0票数 0

有人知道在.net Core2.0中如何在运行时将上下文注入到用户管理器> MongoDB serStore中吗?

我们不能在启动时这样做,因为上下文是动态的,但是UserStore是不可访问的,并且UserManager有太多的变量要更新,这是错误的。有什么解决方案吗?

代码语言:javascript
复制
public class UserStore<TUser> :
        IUserPasswordStore<TUser>,
        IUserRoleStore<TUser>,
        IUserLoginStore<TUser>,
        IUserSecurityStampStore<TUser>,
        IUserEmailStore<TUser>,
        IUserClaimStore<TUser>,
        IUserPhoneNumberStore<TUser>,
        IUserTwoFactorStore<TUser>,
        IUserLockoutStore<TUser>,
        IQueryableUserStore<TUser>,
        IUserAuthenticationTokenStore<TUser>
    where TUser : IdentityUser
{
    private readonly IMongoCollection<TUser> _Users;

//这是我们想要在运行时注入用户的地方

代码语言:javascript
复制
    public UserStore(IMongoCollection<TUser> users)
    {
        _Users = users;
    }

    public virtual void Dispose()
    {
        // no need to dispose of anything, mongodb handles connection pooling automatically
    }

    public virtual async Task<IdentityResult> CreateAsync(TUser user, CancellationToken token)
    {
        await _Users.InsertOneAsync(user, cancellationToken: token);
        return IdentityResult.Success;
    }

不幸的是,用户在启动时是空的,并且应该是空的,因为当时还没有创建租户。

我们也一直在使用saaskit.Multitenancy,但就是找不到解决方案。

任何帮助都将不胜感激。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-03-07 18:30:13

我认为您需要一个通用的存储库来充当IMongoCollection的包装器,然后在控制器中注入存储库

代码语言:javascript
复制
 public class Repository<T>
{
    public IMongoCollection<T> Collection { get; private set; }

    public Repository(IDbFactory dbFactory)
    {
        MongoClient client = new MongoClient("ur connection string");

        this.Collection = client.GetDatabase("db").GetCollection<T>(typeof(T).Name);
    }



       public T Find(Expression<Func<T, bool>> filter)
    {
        return this.Collection.AsQueryable<T>().FirstOrDefault<T>(filter);
    }

    public async Task<T> FindAsync(Expression<Func<T, bool>> filter)
    {
        return await this.Collection.AsQueryable<T>().FirstOrDefaultAsync<T>(filter);
    }

            // here add more methods
}

然后在Startup.cs中注册依赖项,如下所示

代码语言:javascript
复制
 public void ConfigureServices(IServiceCollection services)
    {          
        services.AddTransient(typeof(IRepository<>), typeof(Repository<>));

        services.AddMvc();
    }

最后,在控制器内部注入泛型存储库,也不要忘记在泛型存储库中实现IDisopsible

代码语言:javascript
复制
 public class ProductController : Controller
{
    private readonly IRepository<Product> _productRepository = null;

    public ProductController(IRepository<Product> productRepository)
    {
        this._productRepository = productRepository;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48707841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档