使用通用存储库和IoC在运行时更改数据库

穆罕默德·阿拉比(Mohamed Arabi)

我正在开发一个N-Tier Web应用程序,该应用程序通过IoC的Simple Injector和通用存储库模式为每个客户端使用一个数据库。

当我尝试更改数据库连接时,我发现注入器在Glopal.asax的Application_Start中运行,这里我仍然无法确定当前用户是谁来设置连接字符串,我需要在运行时而不是在Application_Start,有什么想法吗?


我的存储库类的样本

public class Repository<T> : IRepository<T> where T : BaseEntity
{
    private readonly IDBContext _context;
    private IDbSet<T> _entities;

    public Repository(IDBContext context)
    {
        _context = context;
    }

    private IDbSet<T> Entities
    {
        get
        {
            if (_entities == null)
            {
                _entities = _context.Set<T>();
            }
            return _entities;
        }
    }
}

DBContxt类的样本

public class DBContext: DbContext, IDBContext
{
    public DBContext()
        : base("Name=DbConnectionString")
    {
        Database.SetInitializer<DBContext>(null);
    }

    //public DBContext(ConnectionStr connection)
    //    : base(connection.conn)
    //{
    //    Database.SetInitializer<DBContext>(null);
    //}

    public new IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity
    {
        return base.Set<TEntity>();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
            .Where(type => !String.IsNullOrEmpty(type.Namespace))
            .Where(
                type =>
                    type.BaseType != null && type.BaseType.IsGenericType &&
                    type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
        foreach (var type in typesToRegister)
        {
            dynamic configurationInstance = Activator.CreateInstance(type);
            modelBuilder.Configurations.Add(configurationInstance);
        }
        base.OnModelCreating(modelBuilder);
    }
}
Ric .Net

首先,这里您将遇到一个严重的问题,因为要执行此操作,您将必须知道每个用户的密码,或者以某种方式使其简单明了。我不确定是否可以做到。如果可以,下面的代码将为您提供一个良好的起点。

如果仍然要执行此操作,则需要一个UserContext服务,该服务从HttpContext返回当前用户。并由此构建您的连接字符串。

这可能或应该看起来像这样:

public interface IUserContext
{
    string CurrentUser { get; } 
}

public class HttpUserContext : IUserContext
{
    public string CurrentUser
    {
        get { return HttpContext.Current.User.Identity.Name; }
    }
}

public class ConnectionStringFactory
{
    private readonly IUserContext userContext;
    private readonly string partialConnectionString;

    public ConnectionStringFactory(
        IUserContext userContext, 
        string partialConnectionString)
    {
        this.userContext = userContext;
        this.partialConnectionString = partialConnectionString;
    }

    public string GetConnectionString()
    {
            var builder = new SqlConnectionStringBuilder(partialConnectionString);
            builder.UserID = this.userContext.CurrentUser;
            return builder.ConnectionString;
    }
}

//register like this
var connectionStringFactory = new ConnectionStringFactory(
         new HttpUserContext(), 
         "yourconnectionString");
container.RegisterSingle(connectionStringFactory);

container.RegisterPerWebRequest<YourDbContext>(() =>
{
    var connectionFactory = container.GetInstance<ConnectionStringFactory>();
    var entityConnectionString = connectionFactory.GetConnectionString;
    return new YourDbContext(entityConnectionString);
});

注意:对于实体框架,您可能必须调整ConnectionFactory。

更好的解决方案是将集成安全性与SQL Server结合使用,并让您的AppPool模仿当前用户。

更好的方法是使用单个用户帐户(AppPool身份)连接到数据库,并通过在模型中添加一些额外的表并IAuthorizedRepositoryIRepository界面顶部添加诸如的内容来控制应用程序内的身份验证看一下有关此主题的讨论:如何实现基于行的安全性

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 MVC WebApi 2 在运行时更改数据库

来自分类Dev

Azure Web服务-在运行时更改数据库连接字符串

来自分类Dev

在Codeigniter中在运行时更改数据库连接

来自分类Dev

在Codeigniter中在运行时更改数据库连接

来自分类Dev

如何在 .NET 程序中提取 DBMS 请求,同时能够在运行时更改数据库

来自分类Dev

如何使用Entity Framework 6在运行时创建数据库和表?

来自分类Dev

TypeORM:在运行时为 EntityManager(或存储库)动态设置数据库架构?

来自分类Dev

PHP Yii:数据库在运行时连接

来自分类Dev

流明-在运行时创建数据库连接

来自分类Dev

在运行时创建数据库

来自分类Dev

在运行时迁移不同的数据库

来自分类Dev

CSV导入数据库,在运行时更改外键属性

来自分类Dev

EF-在运行时在Firebird和Oracle数据库之间切换

来自分类Dev

在运行时在 Rails 中创建数据库和表

来自分类Dev

在实体框架中的运行时期间更改数据库,而无需更改连接

来自分类Dev

如何在运行时使用Open Liberty切换数据库?

来自分类Dev

如何在运行时使用模型切换SQL数据库

来自分类Dev

在运行时更改数据框的列名

来自分类Dev

在运行时更改数据透视表头

来自分类Dev

在运行时更改数据透视表头

来自分类Dev

如何在运行时提供数据库名称并将所有更改迁移到它

来自分类Dev

是否可以在运行时或编译时更改SSDL内容(Visual Studio 2015 EntityFramework数据库首先与Oracle结合使用)

来自分类Dev

使用实体框架,依赖注入,工作单元和存储库模式在运行时注入/管理更改连接字符串

来自分类Dev

C#:当数据库名称和列名称仅在运行时已知时,将数据库映射到类属性

来自分类Dev

使用NLog和运行时参数登录到数据库

来自分类Dev

在javascript中在运行时从firebase实时数据库动态获取数据

来自分类Dev

多个数据库,其模型稍有变化。如何在运行时允许EF与不同的数据库结构一起使用?

来自分类Dev

Java在运行jar时修改数据库

来自分类Dev

查询名称仅在运行时已知的数据库表

Related 相关文章

  1. 1

    使用 MVC WebApi 2 在运行时更改数据库

  2. 2

    Azure Web服务-在运行时更改数据库连接字符串

  3. 3

    在Codeigniter中在运行时更改数据库连接

  4. 4

    在Codeigniter中在运行时更改数据库连接

  5. 5

    如何在 .NET 程序中提取 DBMS 请求,同时能够在运行时更改数据库

  6. 6

    如何使用Entity Framework 6在运行时创建数据库和表?

  7. 7

    TypeORM:在运行时为 EntityManager(或存储库)动态设置数据库架构?

  8. 8

    PHP Yii:数据库在运行时连接

  9. 9

    流明-在运行时创建数据库连接

  10. 10

    在运行时创建数据库

  11. 11

    在运行时迁移不同的数据库

  12. 12

    CSV导入数据库,在运行时更改外键属性

  13. 13

    EF-在运行时在Firebird和Oracle数据库之间切换

  14. 14

    在运行时在 Rails 中创建数据库和表

  15. 15

    在实体框架中的运行时期间更改数据库,而无需更改连接

  16. 16

    如何在运行时使用Open Liberty切换数据库?

  17. 17

    如何在运行时使用模型切换SQL数据库

  18. 18

    在运行时更改数据框的列名

  19. 19

    在运行时更改数据透视表头

  20. 20

    在运行时更改数据透视表头

  21. 21

    如何在运行时提供数据库名称并将所有更改迁移到它

  22. 22

    是否可以在运行时或编译时更改SSDL内容(Visual Studio 2015 EntityFramework数据库首先与Oracle结合使用)

  23. 23

    使用实体框架,依赖注入,工作单元和存储库模式在运行时注入/管理更改连接字符串

  24. 24

    C#:当数据库名称和列名称仅在运行时已知时,将数据库映射到类属性

  25. 25

    使用NLog和运行时参数登录到数据库

  26. 26

    在javascript中在运行时从firebase实时数据库动态获取数据

  27. 27

    多个数据库,其模型稍有变化。如何在运行时允许EF与不同的数据库结构一起使用?

  28. 28

    Java在运行jar时修改数据库

  29. 29

    查询名称仅在运行时已知的数据库表

热门标签

归档