Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET核心MVC中使用REST代替数据库_C#_Asp.net Core - Fatal编程技术网

C# 在ASP.NET核心MVC中使用REST代替数据库

C# 在ASP.NET核心MVC中使用REST代替数据库,c#,asp.net-core,C#,Asp.net Core,我正在创建一个ASP.NET Core 2.1 MVC应用程序,需要知道如何放置REST代码。我不需要使用数据库,因为所有数据都将来自并发布到我的应用程序外部的rest路由。我不知道这层应该在哪里。我是否应该将调用放在控制器类中,并为传入/传出json对象创建必要的模型?您可以直接在控制器类中进行调用,但这会将控制器类与外部rest服务耦合起来。或者,您可以为外部服务定义一个接口,在单独的类中实现它,并在适合您的应用程序时使用该类 让我们假设外部服务是关于转换货币的,您正在使用的方法(为了简单起

我正在创建一个ASP.NET Core 2.1 MVC应用程序,需要知道如何放置REST代码。我不需要使用数据库,因为所有数据都将来自并发布到我的应用程序外部的rest路由。我不知道这层应该在哪里。我是否应该将调用放在控制器类中,并为传入/传出json对象创建必要的模型?

您可以直接在控制器类中进行调用,但这会将控制器类与外部rest服务耦合起来。或者,您可以为外部服务定义一个接口,在单独的类中实现它,并在适合您的应用程序时使用该类

让我们假设外部服务是关于转换货币的,您正在使用的方法(为了简单起见)称为Convert。它有三个参数,amount,从curreny到currency

通常,请求使用此方法包括提供端点url、提供身份验证信息、在url和/或请求正文中提供参数值。这些对于控制器来说都是不重要的细节,它不应该知道这是GET请求还是POST请求。它不需要知道端点url。它不需要知道身份验证信息,也不需要知道任何与方法契约本身无关的事情

是这样的:

decimal convert(decimal amount, Currency fromCurrency, Currency toCurrency);
public interface ICurrencyService
{
    decimal Convert(decimal amount, CurrencyDTO fromCurrency, CurrencyDTO toCurrency);
}
因此,您定义了一个界面(合同),其外观如下:

decimal convert(decimal amount, Currency fromCurrency, Currency toCurrency);
public interface ICurrencyService
{
    decimal Convert(decimal amount, CurrencyDTO fromCurrency, CurrencyDTO toCurrency);
}
您应该使用rest消费逻辑在具体类中实现它:

public class YahooCurrencyService : ICurrencyService
{
    private string endpointUrl;
    private IYahooAuthenticator authenticator;

    public decimal Convert(decimal amount, CurrencyDTO fromCurrency, CurrencyDTO toCurrency)
    {
        using (var httpClient = new HttpClientOfYourChoice())
        {
            try
            {
                // Doing http work
                httpClient.PutHeaderValues(authenticator.GetHeaderValues());
                httpClient.Url = string.Format("{0}/{1}/{2}?amount={3}", endpointUrl, fromCurrency.Name, toCurrency.Name, amount);
                var response = httpClient.Get();
            }
            catch
            {
                // Exception handling
            }
        }
    }
}
现在,您可以在控制器中使用它,如:

private ICurrencyService currencyService;

现在,系统中的任何实体都不应该知道它们不关心的细节,并且它们不与系统的其他部分耦合。如果你想了解更多关于S.O.L.I.D的原则及其动机,你应该继续去查阅。鲍勃·马丁叔叔对这个话题有很好的解释,还有很多其他专家


注:以上所有代码都是虚构的,您应该自己实现。

您可以直接在控制器类内进行调用,但这会将控制器类耦合到外部rest服务。或者,您可以为外部服务定义一个接口,在单独的类中实现它,并在适合您的应用程序时使用该类

让我们假设外部服务是关于转换货币的,您正在使用的方法(为了简单起见)称为Convert。它有三个参数,amount,从curreny到currency

通常,请求使用此方法包括提供端点url、提供身份验证信息、在url和/或请求正文中提供参数值。这些对于控制器来说都是不重要的细节,它不应该知道这是GET请求还是POST请求。它不需要知道端点url。它不需要知道身份验证信息,也不需要知道任何与方法契约本身无关的事情

是这样的:

decimal convert(decimal amount, Currency fromCurrency, Currency toCurrency);
public interface ICurrencyService
{
    decimal Convert(decimal amount, CurrencyDTO fromCurrency, CurrencyDTO toCurrency);
}
因此,您定义了一个界面(合同),其外观如下:

decimal convert(decimal amount, Currency fromCurrency, Currency toCurrency);
public interface ICurrencyService
{
    decimal Convert(decimal amount, CurrencyDTO fromCurrency, CurrencyDTO toCurrency);
}
您应该使用rest消费逻辑在具体类中实现它:

public class YahooCurrencyService : ICurrencyService
{
    private string endpointUrl;
    private IYahooAuthenticator authenticator;

    public decimal Convert(decimal amount, CurrencyDTO fromCurrency, CurrencyDTO toCurrency)
    {
        using (var httpClient = new HttpClientOfYourChoice())
        {
            try
            {
                // Doing http work
                httpClient.PutHeaderValues(authenticator.GetHeaderValues());
                httpClient.Url = string.Format("{0}/{1}/{2}?amount={3}", endpointUrl, fromCurrency.Name, toCurrency.Name, amount);
                var response = httpClient.Get();
            }
            catch
            {
                // Exception handling
            }
        }
    }
}
现在,您可以在控制器中使用它,如:

private ICurrencyService currencyService;

现在,系统中的任何实体都不应该知道它们不关心的细节,并且它们不与系统的其他部分耦合。如果你想了解更多关于S.O.L.I.D的原则及其动机,你应该继续去查阅。鲍勃·马丁叔叔对这个话题有很好的解释,还有很多其他专家


注:上面所有的代码都是虚构的,你应该自己实现。

这是很好的信息,我也需要它。我感谢有时间帮忙!很高兴我能帮上忙。这是很好的信息,我也需要它。我感谢有时间帮忙!很高兴我能帮忙。