ASP.. NET将模型类型映射到存储库类型
本文关键字:类型 存储 映射 ASP 模型 NET | 更新日期: 2023-09-27 18:11:34
我想知道是否有可能将模型类型映射到c#/ASP.NET的存储库类型。如您所见,我正在尝试实现存储库/工作单元模式。下面显示了一个示例实现:
public class UnitOfWork : IDisposable
{
private SchoolContext context = new SchoolContext();
private DepartmentRepository departmentRepository;
private CourseRepository courseRepository;
public DepartmentRepository DepartmentRepository
{
get
{
if (this.departmentRepository == null)
{
this.departmentRepository = new DepartmentRepository(context);
}
return departmentRepository;
}
}
public CourseRepository CourseRepository
{
get
{
if (this.courseRepository == null)
{
this.courseRepository = new CourseRepository(context);
}
return courseRepository;
}
}
它有一个问题,但是,UnitOfWork需要为每个存储库类型保留一个长长的属性列表。在本例中,情况还不错,因为只有两种实体类型(部门、课程)和两个相应的存储库(部门存储库和课程存储库)。但是随着应用程序规模的增长,UnitOfWork类很快就会变得又大又乱,有几十甚至几百个属性,它将成为一个很好的类。
我想要的是更通用的东西,比如将模型类型映射到存储库对象的通用方法GetRepository()。下面的伪代码演示了我想要的:
// definition
public TRepository GetRepository<TModel>(){ // pending implementation }
// use-case
var departmentRepository = UnitOfWork.GetRepository<TModel>();
那么我如何编写这样的代码,将模型类型映射到存储库对象?我担心AutoMapper不能工作,因为它只在具体实现之间映射,而不是泛型类型。你觉得呢?当条件不是将每个存储库实现硬编码为工作单元中的属性时,您将如何处理这个问题?
你可以这样定义一个扩展方法:
public static class Mapper
{
public static T Map<T>(Object source) where T : class
{
var instance = Activator.CreateInstance<T>();
foreach (var property in typeof(T).GetProperties())
{
if (property.CanRead)
{
var sourceProperty = source.GetType().GetProperty(property.Name);
if (sourceProperty == null)
{
continue;
}
var value = sourceProperty.GetValue(source);
property.SetValue(instance, value);
}
}
return instance;
}
}
如果你想从一个类映射到另一个类:
var foo = Mapper.Map<CustomerViewModel>(new Customer { CustomerID = "ACME", CompanyName = "Acme Corp.", ContactName = "Jhon Doe" });
输出:{CustomerViewModel}公司名称:"Acme公司"CustomerID:"极致"
假设您有以下类:
public class Customer
{
public String CustomerID { get; set; }
public String CompanyName { get; set; }
public String ContactName { get; set; }
}
public class CustomerViewModel
{
public String CustomerID { get; set; }
public String CompanyName { get; set; }
}
此外,这是一个基本的想法,你可以改进这个扩展方法,从动态对象(ExpandoObject),字典(Dictionary<String,>)映射和创建映射表,以更好的性能在集合的映射(大集合的项目)。
这个方法也支持匿名对象。
请让我知道这个答案是否有用,我们可以根据您的要求改进算法