c# - 如何将多个相同的功能类( Controller )组合成一个以数据对象作为参数的类?

标签 c# asp.net asp.net-mvc asp.net-web-api

我有这样的编码方法:

var result = await db.TaskStatuses
     .Select(e => new
     {
         Id = e.TaskStatusId,
         Name = e.Name
     })
     .ToListAsync();

var result = await db.ContentStatuses
         .Select(e => new
         {
             Id = e.ContentStatusId,
             Name = e.Name
         })
         .ToListAsync();

var result = await db.<xxx>
         .Select(e => new
         {
             Id = e.<xxx>Id,
             Name = e.Name
         })
         .ToListAsync();

除了从中获取数据的数据库对象外,所有方法都是相同的。有没有一种方法可以将所有这些组合到一个方法中,我只需将对象作为参数传入?

数据库的创建方式如下:

private myContext db = new MyContext();

 public partial class MyContext : DbContext
    {

        public DbSet<TaskStatuse> TaskStatuses { get; set; }
        public DbSet<ContentStatuses> ContentStatuses { get; set; }

这是 Controller 的完整代码(Asp.Net Web-API):

namespace WebRole1.Controllers
{

    [Route("api/ContentStatus/{id?}", Name = "api_ContentStatus")]
    public class ContentStatusController : ApiController
    {
        private MyContext db = new MyContext();

        public async Task<IHttpActionResult> GetMapData()
        {
            var result = await db.ContentStatuses
                                 .Select(e => new
                                 {
                                     Id = e.ContentStatusId,
                                     Name = e.Name
                                 })
                                 .ToListAsync();
            return Ok(result);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

    }
}

我的问题是我有很多这样的 Controller ,除了数据源之外,它们都是一样的。 ContentStatus、TaskStatus 等

示例类:

public class ContentStatus
{
    public ContentStatus()
    {
        this.Contents = new List<Content>();
    }

    public int ContentStatusId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Content> Contents { get; set; }
}

public class TaskStatus
{
    public TaskStatus()
    {
        this.Tasks = new List<Task>();
    }

    public int TaskStatusId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Task> Tasks { get; set; }
}

最佳答案

您可以为您的类创建一个公共(public)接口(interface),在您的方法中公开您需要的属性。然后,您可以在一个可以处理任一类型项目的方法中使用此接口(interface)

public interface IIdentifiableStatus
{
    int Id { get; }
    string Name { get; }
}

public class ContentStatus : IIdentifiableStatus
{
    public ContentStatus()
    {
        this.Contents = new List<Content>();
    }

    public int ContentStatusId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Content> Contents { get; set; }

    int IIdentifiable.Id
    {
        get { return ContentStatusId; }
    }

    string IIdentifiable.Name
    {
        get { return Name; }
    }
}

public class TaskStatus : IIdentifiableStatus
{
    public TaskStatus()
    {
        this.Tasks = new List<Task>();
    }

    public int TaskStatusId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Task> Tasks { get; set; }

    int IIdentifiable.Id
    {
        get { return TaskStatusId; }
    }

    string IIdentifiable.Name
    {
        get { return Name; }
    }
}

您的方法将如下所示:

public async Task<IHttpActionResult> GetMapData(IEnumerable<IIdentifiableStatus> statuses)
{
    var result = await statuses
        .Select(e => new {
            Id = e.Id,
            Name = e.Name
        })
        .ToListAsync();
    return Ok(result);
}

你可以这样调用方法:

GetMapData(db.ContentStatuses)

或:

GetMapData(db.TaskStatuses)

关于c# - 如何将多个相同的功能类( Controller )组合成一个以数据对象作为参数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24114346/

相关文章:

c# - 仅在找到给定的字符串后才查找正则表达式

c# - 尝试协商时出现 SignalR 404 错误

asp.net - Google Chrome在浏览器关闭后保留 session 变量

asp.net - Orchard CMS - 确定模型在内容项驱动程序中是否有效

c# - 单一职责 vs 封装

c# - 检查列表中的所有属性

c# - #在 C# 中定义编译器指令

c# - 从数据集中的数据表中删除所有行

c# - ASP.NET MVC 和实体 - 使用原始 SQL 时加载导航属性/对象

asp.net-mvc - OWIN 身份验证和自定义响应