我有一个带有40个表的Sql DB,并且我建立了代表每个表的模型,我也使用Dapper作为我的ORM ...
我正在DAL(数据访问层)中构建CRUD语句,该语句将使用myModelObj
(通过HTTPPost进入)和modelName
(通过URL参数进入)
我还有一个方法(MyMapper
)会将我的myModelObj
映射到我的模型-但是我创建的方法的类型为object
,它返回System.Object
类型-我想发生的是该方法返回模型并动态/在运行时转换调用方法的数据类型,以匹配要返回的模型类型...
我的代码:
控制器
private readonly IDbOperation _dbo;
...
...
public DataController(IDbOperation dboperation)
{
_dbo = dboperation;
}
...
[HttpPost("create/{modelName}",Name = "Generic CRUD: Create Method")]
[Produces("application/json")]
public actionResult Create([FromBody] JObject createObject,string modelName)
{
try
{
... ... ...
object response = _dbo.CreateRecord(createObject,modelName);
// HTTP Post Body example
{
"Fullname": "Juan Carlos","Firstname": "Juan","Lastname": "Carlos","Salutation": "Dr.","Age": 30,"CreatedOn": "2019-11-07T12:25:10"
}
DbOperation
private readonly IDbConnector _dbConnector
...
public DbOperation(IDbConnector dbConnector)
{
_dbConnector = dbConnector;
}
public JsonResult CreateRecord(JObject model,string modelName)
{
... ... ...
var create = MyMapper(modelName,model); // <<<
... ...
try
{
using (var connection = _dbConnector.GetMsSqlConnection())
{
// https://dapper-tutorial.net/insert
var createdId = connection.Insert(create);
...
}
}
}
private object MyMapper(string modelName,JObject mod)
{
switch (modelName.ToLower())
{
case "transaction":
return JsonConvert.DeserializeObject<ModelRepodTO.Transaction>(model.ToString());
case "items":
return JsonConvert.DeserializeObject<ModelRepodTO.Items>(model.ToString());
case "users":
return JsonConvert.DeserializeObject<ModelRepodTO.Users>(mod.ToString());
...
...
default:
_logger.Error("DataaccessLayer","DbOperation",">>> Mapping decision could not be made");
break;
}
}
DbConnector
public class DbConnector : IDbConnector
{
private readonly string _connectionstring;
public DbConnector(IConfiguration config)
{
_connectionstring = config.Getvalue<string>("Connectionstring");
}
public SqlConnection GetMsSqlConnection()
{
SqlConnection conn = null;
try
{
conn = new SqlConnection(_connectionstring);
conn.Open();
if (conn.State != ConnectionState.Open)
{
// throw error
}
}
catch (Exception ex)
{
if (conn != null && conn.State == ConnectionState.Open)
{
conn.Close();
}
conn = null;
}
// return the connection
return conn;
}
}
(当前)从MyMapper("User",{<Object from HTTP Post>})
返回的数据类型为System.Object
,因为MyMapper
的类型为object
我想要的是动态更改数据类型以匹配模型...
MyMapper("User",{<Object from HTTP Post>})
=>数据类型= User
请记住,我可以对40种不同的表/模型进行CRUD,显然,直到运行时,我才知道要调用哪个表/模型。
(完成示例)
...我拿了MyMapper
返回的对象并将其传递给connection.insert(...);
(我修改了帖子以显示此内容-查看DbOperation)
有什么建议吗?有想法吗?