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

本文关键字:字符串 连接 是否 缓存 返回 如果不 服务器 何创建 创建 管理器 检测 | 更新日期: 2023-09-27 18:05:02

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

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

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

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

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

我想我不确定我是否应该设置我的程序使用IRepository与所有自动连接感应在幕后,或者如果我应该有IRepositoryManager有IRepository和IConnectionStringManager在它。

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

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

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

更新

因为你正在使用实体框架,这里有一个想法,它可能看起来像代码:

// 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();
        }
    }
}