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不能工作,因为它只在具体实现之间映射,而不是泛型类型。你觉得呢?当条件不是将每个存储库实现硬编码为工作单元中的属性时,您将如何处理这个问题?

ASP.. NET将模型类型映射到存储库类型

你可以这样定义一个扩展方法:

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,>)映射和创建映射表,以更好的性能在集合的映射(大集合的项目)。

这个方法也支持匿名对象。

请让我知道这个答案是否有用,我们可以根据您的要求改进算法