c# - 如何创建一个连接字符串管理器来检测服务器是否可用,如果不可用则返回缓存连接字符串

标签 c# sql repository connection-string synchronization

我有一个偶尔连接的应用程序,其中有一个存储产品信息的服务器。我正在使用数据库缓存在本地存储此信息,因此当连接不可用时,应用程序在尝试读取数据库时仍然可以工作。

由于数据库已配置且我无权修改表,因此我没有实现 2 路更新,它仅下载快照。一个附带的问题是,是否可以创建数据库缓存并与客户端计算机上的跟踪列进行双向同步?我无法向服务器添加任何列或表。我知道这可能是一个单独的帖子的问题,但如果这是真的那么它会完全改变我对这个问题的方向,一个单独的模块检测和同步数据库并处理抛出的任何同步错误并始终连接到缓存。

我正在使用一个通用存储库,我想知道如果连接可用或不可用,以及根据此状态使用本地或远程数据库的最佳实践是什么。

我是否应该向通用存储库添加一个接口(interface)来处理返回正确的字符串,并让存储库知道它是否存在?我需要根据连接状态启用/禁用某些功能,因此我还需要某个地方的属性,以便在使用此存储库时可以有一种方法将各种控件启用状态绑定(bind)到此状态。

我是否应该有一个包含例如 IRepository 和 IConnectionStringManager 的包装器,然后根据可用性处理提供和初始化存储库连接字符串?此包装器将公开存储库和所需的任何状态属性。

我想我不确定我是否应该将我的程序设置为使用 IRepository 以及幕后的所有自动连接感应,或者我是否应该使用包含 IRepository 和 IConnectionStringManager 的 IRepositoryManager。

也许这两个选项都是错误的?

最佳答案

我喜欢 Entity Framework 允许您提供连接字符串作为其上下文的构造函数参数的方式。这样您就可以利用依赖注入(inject)框架在创建上下文时应用特殊逻辑,并且您只需更改一个地方的代码(假设您使用的是 DI 原则)。您可以对存储库实现执行类似的操作。

更新

由于您使用的是 Entity Framework,下面是它在代码中的样子:

// DI Bindings, Ninject style
Bind<Func<MyContext>>().ToMethod(
    c => new MyContext(
             c.Kernel.Get<IConnectionManager>().IsOnline()
                 ? OnlineConnectionString 
                 : OfflineConnectionString));

// Usage
public class ThingRepository : IThingRepository 
{
    private Func<MyContext> _getContext;
    public ThingRepository(Func<MyContext> getContext)
    {
        _getContext = getContext;
    }

    public IEnumerable<Thing> GetAllThings()
    {
        using(var context = _getContext())
        {
            return context.Things.ToList();
        }
    }
}

或者,如果您更喜欢使用更明确的工厂实现:

public interface IMyContextFactory
{
    MyContextFactory Get();
}

public class MyContextFactory : IMyContextFactory
{
    private const string OnlineConnectionString = "...";
    private const string OfflineConnectionString = "...";
    private IConnectionManager _connectionManager;
    public MyContextFactory(IConnectionManager connectionManager)
    {
        _connectionManager = connectionManager;
    }
    public MyContextFactory Get() 
    {
        var connectionString = _connectionManager.IsOnline() 
            ? OnlineConnectionString 
            : OfflineConnectionString
        return new MyContext(connectionString);
    }
}

// DI Bindings, Ninject style
Bind<IMyContextFactory>().To<MyContextFactory>();

// Usage
public class ThingRepository : IThingRepository 
{
    private IMyContextFactory _myContextFactory;
    public ThingRepository(IMyContextFactory myContextFactory)
    {
        _myContextFactory = myContextFactory;
    }

    public IEnumerable<Thing> GetAllThings()
    {
        using(var context = _myContextFactory.Get())
        {
            return context.Things.ToList();
        }
    }
}

关于c# - 如何创建一个连接字符串管理器来检测服务器是否可用,如果不可用则返回缓存连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7016393/

相关文章:

php - MySQL INNER JOIN 复制一列

java - JPA删除不执行

c# - 通用存储库问题

azure - 连接到 Azure VM 上的 Nexus 3 Preview 上存储的 Docker 注册表时出现问题

c# - Gif 图像无法在 Microsoft Teams 中播放

c# - Controller 包裹在面板中

c# - 使用PInvoke捕获远程计算机的CD Rom信息

c# - 新的 DbConnection 性能

iphone - 如何从 SQL 数据库获取数据到 Core-Data?

sql - CREATE TRIGGER 在 SQL Server 2005 上花费的时间超过 30 分钟