我正在努力找到添加更多内容的正确方法" GET"使用EF和存储库将语句返回到我的第一个web api项目。我已经关注了大量示例和教程,他们都展示了如何设置web api,但现在我尝试添加它。例如,如果我有第二个类,我如何获取这个新类的所有值?
到目前为止,我已经在线跟踪标准示例,一切正常。 到目前为止我所做的是创建第二个控制器,然后将方法名称添加到我的IRepository,并将实际代码添加到我的Repository.cs。
我只想确保以正确的方式做到这一点。基本上,我应该继续为每个我想要单独返回的类添加控制器,然后只是让我的存储库越来越长?这是正确的方法吗?
第一个控制器(基于教程)
public interface IRepository
{
IQueryable<Client> GetAllClients();
IQueryable<Client> GetAllClientsWithDetails();
Client GetClient(int id);
IQueryable<Trade> GetAllTrades();
Trade GetTrade(int id);
}
IREPOSITORY
public class Repository : IRepository
{
private xxxxV002Context db;
public Repository(xxxxV002Context db)
{
this.db = db;
}
//------------------------------------------------------------------------
public IQueryable<Client> GetAllClients()
{
return db.Clients;
}
public IQueryable<Client> GetAllClientsWithDetails()
{
return db.Clients.Include("Mapping_ClientAccount");
}
public Client GetClient(int id)
{
return db.Clients.Include("Mapping_ClientAccount.Account").FirstOrDefault(o => o.ClientID == id);
}
//-----------------------------------------------------------------------
public IQueryable<Trade> GetAllTrades()
{
return db.Trades;
}
public Trade GetTrade(int id)
{
return db.Trades.FirstOrDefault(x => x.TradeID == id);
}
}
REPOSITORY
public class TradeController : ApiController
{
private IRepository _repo;
public TradeController(IRepository repo)
{
_repo = repo;
}
// GET api/<controller>
public IQueryable<Trade> Get()
{
return _repo.GetAllTrades();
}
// GET api/<controller>/5
public Trade Get(int id)
{
return _repo.GetTrade(id);
}
// POST api/<controller>
public void Post([FromBody]string value)
{
}
// PUT api/<controller>/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/<controller>/5
public void Delete(int id)
{
}
}
第二控制器(新)
public class ClientController : ApiController
{
private IRepository _repo;
public ClientController(IRepository repo)
{
_repo = repo;
}
public IQueryable<Client> Get()
{
return _repo.GetAllClients();
}
public IQueryable<Client> Get(bool includeDetails)
{
IQueryable<Client> query;
if (includeDetails)
{
query = _repo.GetAllClientsWithDetails();
}
else
{
query = _repo.GetAllClients();
}
return query;
}
public Client Get(int id)
{
return _repo.GetClient(id);
}
[Route("api/client/{customerId}/orders")]
[HttpGet]
public Trade GetOrdersByCustomer(int customerId)
{
xxxxContext db = new xxxxContext();
var x1 = db.Trades.FirstOrDefault(x => x.TradeID == customerId) as xxxx.Models.Trade;
return x1;
}
}
正如测试我将其添加到ClientController,并使用Routes我成功地从不同的类返回数据。所以我甚至需要有多个控制器,或者我可以继续在一个控制器中放置更多方法?什么是最佳做法?
var delegate : tableCellBtnActionDelegate?
答案 0 :(得分:1)
您可以使用路由功能指定api支持的GET操作以及所需的参数。
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
例如,如果您希望按名称或ID获取User
,则可能如下所示:
[Route("users/{id:int}"]
public User GetUserById(int id) { ... }
[Route("users/{name}"]
public User GetUserByName(string name) { ... }
(Route
属性放在您的操作上)
答案 1 :(得分:1)
我会回应@LoekD所说的内容,我想补充说,将http动词属性放在你的方法上是一个好主意,而不仅仅是依赖于约定。如果您的控制器变得更大并且使事情更加一致,它会使事情变得更加清晰。
例如,在这个方法上:
getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() {
...
@Override
public void onTransitionEnd(Transition transition) {
Animator anim = ObjectAnimator.ofFloat(myNestedScrollView, "alpha", 0f, 1f);
anim.setInterpolator(new DecelerateInterpolator());
anim.setDuration(1000);
ns.setVisibility(View.VISIBLE);
anim.start();
}
...
});
成功:
public IQueryable<Client> Get(bool includeDetails)
这不是必要的,但它将为您节省时间。
对于您的存储库,它应该只返回特定类型。根据上面的代码,您需要[HttpGet]
public IQueryable<Client> Get(bool includeDetails)
个对象的存储库和Client
个对象的另一个存储库。
除此之外,我认为你走的是正确的道路。