我已经完成了一个ASP.NET Web应用程序项目,并从数据库中添加了两个ADO.NET实体数据模型元素及其相应的控制器。
事实是两个数据库都包含相同的表,具有相同的结构,但具有不同的数据。例如,在两个数据库中都有此表:
public partial class User
{
public long id { get; set; } // Autoincrement
public string bd { get; set; }
public string username { get; set; }
public string password { get; set; }
public short role { get; set; }
}
只有2个,使用2个Models和2个Controller时的冗余并不是一个大问题,但是现在我想添加更多具有相同特征的数据库(具有相同结构但数据不同的User表)>
是否有所有表可以合并并拥有一个Controller的方法?而且,此外,控制器将允许我执行以下操作:
•全部获取:从所有User表获取所有数据
•GET / id / bd:获取在URL中传递的具有id和bd的数据
•POST:在存储在bd属性中的数据库中添加新用户
•PUT / id:使用存储在bd属性中的id和数据库修改数据
答案 0 :(得分:0)
好吧,如果所有表都相同,那么您不需要多个冗余模型,您只需使用一个即可。这可以解决问题的一方面。
您可以做的另一件事是存储连接字符串列表,为每个字符串分配一个唯一的标识符,然后通过一个控制器访问它们。您只需要在路由中使用一个额外的参数即可指定要使用的数据库。因此,您现在可以使用一种用户模型和一种控制器,以及所需的任何方法,而无需重复实现同一件事。
例如,您的路由可能类似于api / client1 / users。 client1标识符告诉您需要连接到哪个数据库。
当然还有其他考虑因素,例如您可能需要将此暴露给外界。在这种情况下,您可以使用JWT授权系统,则为每个客户端分配一个ClientID,然后根据该ClientID知道要连接到哪个数据库。如果您使用的是这样的系统,则无需在URL中传递任何额外的数据,只需发出令牌,然后添加声明即可说明要使用哪个数据库即可。
答案 1 :(得分:0)
感谢您的回答,但是我已经能够用另一种方式解决它。
我已将不同的数据库存储在Dictionary中,其中Key为数据库的名称,并为动态类型赋值。通过这种方式,我无需调用数据库的对象,而是调用通过请求中的参数传递的,存储在数据库中的Dictionary的动态。这样,我只需向字典中添加一个元素即可添加更多数据库,从而节省了很多冗余代码。
作为更改示例,我向您展示了以前和现在的Get / id / bd方法:
public class UsersController : ApiController
{
// Before
private typeDB1 db = new typedb1();
private typeDB2 db2 = new typedb2();
[ResponseType(typeof(User))]
[Route("api/users/{id}/{bdatos}")]
public IHttpActionResult GetUser(long id, string bdatos)
{
try
{
if(bdatos == "typeDB1")
{
typeDB1.User userdb1 = typeDB1.Find(id);
if (userdb1 == null)
{
return NotFound();
}
return Ok(userdb1);
}
else
{
typeDB2.User userdb2 = typeDB2.Find(id);
if (userdb2 == null)
{
return NotFound();
}
return Ok(userdb2);
}
}
catch (Exception ex)
{
throw ex;
}
}
// Now
private typeDB1 db = new typedb1();
private typeDB2 db2 = new typedb2();
private Dictionary<string, dynamic> dbDictionary = new Dictionary<string, dynamic>
{
("typeDB1", db),
("typeDB2", db2)
};
[ResponseType(typeof(User))]
[Route("api/users/{id}/{bdatos}")]
public IHttpActionResult GetUser(long id, string bdatos)
{
try
{
dynamic certificate = dbDictionary[bdatos].Find(id);
if (certificate == null)
{
return NotFound();
}
return Ok(certificate);
}
catch (Exception ex)
{
throw ex;
}
}
}
答案 2 :(得分:-1)
您可以使用AutoMapper将User数据模型(来自不同的数据库)映射到控制器中使用的User对象。