首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用抽象类型实现抽象类

用抽象类型实现抽象类
EN

Stack Overflow用户
提问于 2016-10-12 21:24:50
回答 2查看 524关注 0票数 1

我有一个基础抽象类,它接受来自抽象类的类型,并且我正在拼命地思考如何正确地实现这一点。

基类:

代码语言:javascript
复制
public abstract class ApiService<TRequest, TResponse>
    where TRequest : ApiRequest
    where TResponse : ApiResponse
{
    public abstract TResponse Execute(TRequest Request);
}

ApiRequest类:

代码语言:javascript
复制
public abstract class ApiRequest
{

}

ApiResponse类:

代码语言:javascript
复制
public abstract class ApiResponse
{
    public bool Succeeded { get; set; }

}

我创建了一个TestService类来尝试解决这个问题,但是这些概念并不适合我:

代码语言:javascript
复制
public class TestService : ApiService<ApiRequest, ApiResponse>
{
    public override ApiResponse Execute(ApiRequest Request)
    {
        ApiResponse response;

        return (response);
    }

您所能提供的任何帮助都将不胜感激,并帮助我进一步理解抽象类!谢谢!

所以我的问题是:--我不知道如何在Execute方法中实现ApiResponse,因为您不能实例化抽象类。

EN

回答 2

Stack Overflow用户

发布于 2016-10-12 22:06:40

仿制药和多菌根茎是好的,但它必须在某个时候停止。在您的例子中,您有一个很好的API接口,很明显,您传递了一个TRequest并为它接收了一个TResponse

你应该补充的是如何处理特定的病例。添加一个IRequestHander<TRequest,TResult>层,该层将知道如何从特定的Request创建特定的Request

然后,使用Factory设计模式,您的API函数将调用工厂,以获得适合其请求的特定处理程序。它将执行RequestHander并返回它从中获得的Response

代码语言:javascript
复制
public class SpecificRequestA : ApiRequest {}
public class SpecificResponseA : ApiResponse{}

public interface IRequestHander<TRequest,TResponse>
    where TRequest : ApiRequest
    where TResponse : ApiResponse
{
    TResponse Exeute(TRequest request);
}

public class SpecificRequestHandlerA : IRequestHander<SpecificRequestA,SpecificResponseA>
{
    SpecificResponseA Execute(SpecificRequestA request)
    {
        //create the new response out of the given request. Here you know exactly on what you are working :)
    }
}

然后加上工厂。

还可以考虑将请求实现为Request<TResponse> --看看它是否更适合您的情况。

我建议查看依赖注入和DI容器(如城堡、Ninject、Unity、Simple )来负责初始化。

票数 4
EN

Stack Overflow用户

发布于 2016-10-12 23:12:23

我在ApiClient MVC UI层中使用了以下c#类:

代码语言:javascript
复制
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;

namespace DocumentManager.UI
{
    public class ApiClient<T>
    {
        public ApiClientErrorTypes Error{get;private set;}

        private string baseUri =  @"http://localhost/DocumentManager.WebAPI/";

        public T ApiGet(string requestUrl)
        {
            using (var client = new HttpClient())
            {
                var requestUri = new Uri(baseUri + requestUrl);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                if (ApiAuthToken.token != null)
                {
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiAuthToken.token.ToString());
                }
                var response = client.GetAsync(requestUri).Result;
                string contentString = response.Content.ReadAsStringAsync().Result;
                if (response.IsSuccessStatusCode)
                {
                    T result = JsonConvert.DeserializeObject<T>(contentString);
                    return result;
                }
                if (int.Parse(response.StatusCode.ToString()) > 400 && int.Parse(response.StatusCode.ToString()) <= 499)
                    Error = ApiClientErrorTypes.UnAuthorised;
                else
                    Error = ApiClientErrorTypes.Technical;
                return default(T);
            }
        }

        public T ApiPost(string requestUrl, HttpContent encodedContent)
        {
            using(var client = new HttpClient())
            {
                var requestUri = new Uri(baseUri + requestUrl);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                if (ApiAuthToken.token != null)
                {
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiAuthToken.token.ToString());
                }
                var response = client.PostAsync(requestUri, encodedContent).Result;
                string contentString = response.Content.ReadAsStringAsync().Result;
                if (response.IsSuccessStatusCode)
                {
                    T result = JsonConvert.DeserializeObject<T>(contentString);
                    return result;
                }
                if (int.Parse(response.StatusCode.ToString()) > 400 && int.Parse(response.StatusCode.ToString()) <= 499)
                    Error = ApiClientErrorTypes.UnAuthorised;
                else
                    Error = ApiClientErrorTypes.Technical;
                return default(T);
            }
        }

        public bool ApiPostBool(string requestUrl, HttpContent encodedContent)
        {
            using (var client = new HttpClient())
            {
                var requestUri = new Uri(baseUri + requestUrl);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                if (ApiAuthToken.token != null)
                {
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiAuthToken.token.ToString());
                }
                var response = client.PostAsync(requestUri, encodedContent).Result;
                string contentString = response.Content.ReadAsStringAsync().Result;
                if (response.IsSuccessStatusCode)
                {
                    return true;
                }
                return false;
            }
        }
    }
}

我按照MVC控制器的如下方式对此进行了调用:

代码语言:javascript
复制
var apiClient = new ApiClient<Document>();
var doc = apiClient.ApiGet("api/document/get/" + id);
if (doc != null)
{
    //do stuff here
}

我使用以下Web层方法返回此项

代码语言:javascript
复制
namespace DocumentManager.WebApi.Controllers
{
    [RoutePrefix("api/document")]
    public class DocumentController : BaseController
    {
        [Route("get/{id}")]
        public IHttpActionResult Get(int id)
        {
            return Ok(DACDocument.Read(new DataContext(),id));
        }
    }
}

这背后有一个实体框架数据层(DAC.)

我之所以使用这种架构结构,是因为我希望多个MVC UI前端应用程序能够绑定到API后端。

解决方案中的项目是数据(类库) API (Web ) UI (Web )

如果这有帮助,请标记为答案!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40008602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档