[英]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.