C# 在ASP.NET核心MVC中使用REST代替数据库
我正在创建一个ASP.NET Core 2.1 MVC应用程序,需要知道如何放置REST代码。我不需要使用数据库,因为所有数据都将来自并发布到我的应用程序外部的rest路由。我不知道这层应该在哪里。我是否应该将调用放在控制器类中,并为传入/传出json对象创建必要的模型?您可以直接在控制器类中进行调用,但这会将控制器类与外部rest服务耦合起来。或者,您可以为外部服务定义一个接口,在单独的类中实现它,并在适合您的应用程序时使用该类 让我们假设外部服务是关于转换货币的,您正在使用的方法(为了简单起见)称为Convert。它有三个参数,amount,从curreny到currency 通常,请求使用此方法包括提供端点url、提供身份验证信息、在url和/或请求正文中提供参数值。这些对于控制器来说都是不重要的细节,它不应该知道这是GET请求还是POST请求。它不需要知道端点url。它不需要知道身份验证信息,也不需要知道任何与方法契约本身无关的事情 是这样的:C# 在ASP.NET核心MVC中使用REST代替数据库,c#,asp.net-core,C#,Asp.net Core,我正在创建一个ASP.NET Core 2.1 MVC应用程序,需要知道如何放置REST代码。我不需要使用数据库,因为所有数据都将来自并发布到我的应用程序外部的rest路由。我不知道这层应该在哪里。我是否应该将调用放在控制器类中,并为传入/传出json对象创建必要的模型?您可以直接在控制器类中进行调用,但这会将控制器类与外部rest服务耦合起来。或者,您可以为外部服务定义一个接口,在单独的类中实现它,并在适合您的应用程序时使用该类 让我们假设外部服务是关于转换货币的,您正在使用的方法(为了简单起
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的原则及其动机,你应该继续去查阅。鲍勃·马丁叔叔对这个话题有很好的解释,还有很多其他专家
注:上面所有的代码都是虚构的,你应该自己实现。这是很好的信息,我也需要它。我感谢有时间帮忙!很高兴我能帮上忙。这是很好的信息,我也需要它。我感谢有时间帮忙!很高兴我能帮忙。