具有多个DBContext的存储库还是每个具有DBContext的多个存储库?

时间:2020-06-26 20:24:25

标签: c# asp.net-core .net-core asp.net-core-webapi

我正在使用资源及其子资源创建一个Web API。由于该API将托管在具有不同数据库模式的多台服务器上(我无法更改),因此我需要创建>>> robjs.r.range(dti_df) R[write to console]: Error in FUN(X[[i]], ...) : only defined on a data frame with all numeric variables 的不同实现,并在DBContext中创建一些逻辑来处理基于Startup.cs中的属性。有些服务器将资源数据存储在不同的数据库中,这意味着我必须对这些服务器的实现使用多个appsettings.json

出现了一个问题,我应该如何以最小化代码重复的方式构造存储库和上下文,同时又使代码膨胀得那么低?

我应该为包含多个上下文的资源及其子资源创建单个存储库吗?如果是这样,如何确保我的应用程序实例化并将这些多个上下文绑定到存储库?

我应该为每个资源创建一个单独的资源库,每个资源都保存其对应的上下文吗?

我在这里使用了错误的模式还是滥用了模式?

1 个答案:

答案 0 :(得分:1)

最重要的是,您必须定义用于处理数据的抽象。这些是接口。许多遵循SOLID原理的小型接口。

例如:

interface IUser
{
    User GetById(int id);
    void Save(User user);
}

此外,您可以走得更远,并将此界面分解为更小的界面:

interface IGetUser
{
    User GetById(int id);
}

interface ISaveUser
{
    void Save(User user);
}

这不是一个庞大的IRepository界面,它具有数十种方法。

然后,您在代码中使用这些接口,而无需过多考虑它们的实现方式。

现在您可以在一个地方使用这样的小型存储库:

class FirstUserRepository : IUser
{
    private FirstContext _context;

    // here constructor

    public User GetById(int id)
    {
        return _context.Users.FirstOrDefault(u => u.Id == id);
    }
    // ...
}

在另一个地方这样:

class SecondUserRepository : IUser
{
    private SecondContext _context;
    //...
}

因此,将创建必要的上下文实现,并将其链接到不同的数据库。

// Connect to a one database
class FirstContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Customer> Customers { get; set; }
}

// Connect to an another database
class SecondContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Product> Products { get; set; }
}

以此类推。