我正在使用资源及其子资源创建一个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
。
出现了一个问题,我应该如何以最小化代码重复的方式构造存储库和上下文,同时又使代码膨胀得那么低?
我应该为包含多个上下文的资源及其子资源创建单个存储库吗?如果是这样,如何确保我的应用程序实例化并将这些多个上下文绑定到存储库?
我应该为每个资源创建一个单独的资源库,每个资源都保存其对应的上下文吗?
我在这里使用了错误的模式还是滥用了模式?
答案 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; }
}
以此类推。