使用ASPNET Core通过反射创建OData控制器

时间:2018-01-03 05:24:17

标签: asp.net-mvc asp.net-core odata

我正在尝试使用ASPNET Core的新ODATA功能来公开我的应用程序中的数据。我的所有数据访问都通过一组公共基类公开,因此我不想创建50个不同的ODataController类,而是希望有一个公共类,并使用不同的类型参数对其进行实例化。我创建了我的公共类,但我不知道如何告诉ASPNETCORE使用反射创建一堆控制器。

有没有人有任何关于如何做到这一点的例子?我基本上希望能够编写如下代码:

ODataControllers.Add(new CommonApiController<MatterJson, IMatterCommand, MatterStorage, MatterApi>());

(当然我也会通过反思来自动化,我只是想以此为例)。

我的控制器类如下:

public class CommonApiController<TJson, TAdd1, TStorage, TApi> : ODataController
    where TJson : class, IDResult, ITimestamped, new()
    where TAdd1 : class, IApiCommand
    where TStorage : RepositoryItem<TJson, TStorage>, new()
    where TApi : CrudApi<TJson, TAdd1> {

    public ICachedCrudApi<TJson, TAdd1, TStorage, TApi> API { get; private set; }

    public CommonApiController(ICachedCrudApi<TJson, TAdd1, TStorage, TApi> API) {
        this.API = API;
    }


    public virtual IEnumerable<TJson> Get(ODataQueryOptions<TJson> options) {
        var settings = new ODataValidationSettings() {
            AllowedQueryOptions = AllowedQueryOptions.All
        };
        options.Validate(settings);

        var query = API.List().AsQueryable();

        var results = options.ApplyTo(query);
        return (results as IQueryable<TJson>).ToList();
    }


    public virtual async Task<TJson> Get([FromODataUri] long key) {
        var query = await API.Get(key)
            .DefaultAwait()
            ;

        return query.Response;
    }

}

0 个答案:

没有答案