簡體   English   中英

如何將多個相同的功能類(控制器)組合到一個以數據對象作為參數的類中?

[英]How can I combine multiple same functionality classes (controllers) into one that takes a data object as a parameter?

我有如下所示的編碼方法:

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; }

這是控制器的完整代碼(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);
        }

    }
}

我的問題是我有很多這樣的控制器,除了數據源之外,它們都是一樣的。 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 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM