服务栈新服务并列的ASP.NET MVC网站

 2023-02-17    377  

问题描述

在例子 servicestack我没有看到一个是ASP.NET的一个应用程序MVC网站首先是制作ServiceStack服务的第二个.

让我们拍摄一个非常简单的ASP.NET MVC Web应用程序,通过视图呈现产品.它使用控制器,视图,模型和视图.

服务栈新服务并列的ASP.NET MVC网站

让我们说我们有一个型号Product,它被持续到文件db中.让我们假设我们有一个ViewModel的ProductViewModel,它从Product映射到MVC Razor View/PartialView中.

所以这是一个网址的东西.Now让我们假设我们想向各种客户端添加一个服务返回产品,如Windows 8应用程序.

如果请求/响应类完全断开我们已经拥有的东西?我们的ProductViewModel可能已经包含我们要从服务返回的所有内容.

由于我们已经有Product(模型类),我们不能在API命名空间中拥有另一个Product类..我们可以在可能的情况下,但这使得事情不清楚,我想避免这种情况.

所以,如果我们在API命名空间中介绍独立的ProductRequest类和ProductRequestResponse(继承ProductViewModel)类?

如此ProductRequestResponse : ProductViewModel?

我所说的是,我们已经拥有模型和ViewModel类,并为SS服务构建请求和响应类,我们必须创建另一个两个文件,主要是通过从我们已经拥有的类中复制所有内容.这看起来不对我好,它可能遵循关注的指导方针,但干燥也是重要的,实际上不仅仅是分离一切(分离一切都会导致重复代码).

我希望看到的是一个Web应用程序已经制作的情况,它当前具有模型和ViewModels,并返回Web上显示的相应视图,但可以扩展到支持程序化客户端的全功能服务还像Ajax客户端等……与我们已经拥有的东西.

另一件事:

如果您查看此示例 https://github.com/servicestack/servicestack.examples/blob/master/src/servicestack.movi​​erest/movieservice.cs

您将看到有Movie请求类和Movies请求类(一个用于单电影请求,另一个用于电影列表).因此,还有两个服务,MovieService和MoviesService,一个处理单张电影的请求,另一个用于电影类型的另一部电影.

现在,虽然我喜欢ss方法,但我认为它是正确的,我不喜欢这种分离只是因为请求的类型.如果我想谁是导演的电影怎么办?我是否会发明又是一个拥有Director属性的又一个请求类,但是它的另一个服务(MoviesByDirector)?

我认为样品应该面向一个服务.必须处理电影的一切都需要在一个屋檐下.如何用服务来实现这一点?

public class ProductsService : Service
{
    private readonly IDocumentSession _session;
    private readonly ProductsHelperService _productsHelperService;
    private readonly ProductCategorizationHelperService _productCategorization;

    public class ProductRequest : IReturn<ProductRequestResponse>
    {
        public int Id { get; set; }
    }

    // Does this make sense? 
    // Please note, we use ProductViewModel in our Views and it holds everything we'd want in service response also
    public class ProductRequestResponse : ProductViewModel
    {
    }

    public ProductRequestResponse GetProducts(ProductRequest request)
    {
        ProductRequestResponse response = null;
        if (request.Id >= 0)
        {
            var product = _session.Load<Product>(request.Id);
            response.InjectFrom(product);
        }
        return response;
    }
}

推荐答案

服务层是您最重要的合同

您可以在整个系统中创建的最重要的界面是您的外部面向服务合同,这是您服务或应用程序的消费者将绑定到,即现有的呼叫站点通常不会更新使用代码库 – 每个其他模型都是次要的.

DTO是远程服务的最佳实践

在以下关注 Martin Fowler使用DTOS (数据传输对象)进行远程服务的建议(),鼓励使用干净的未绘制的POCO来定义一个明确的合同,应该保持在很大程度上和无依赖性的.dll.这样的好处允许您能够重新使用键入的DTO,用于定义您的服务,AS-IS,您的 C#/.NET客户端 – 提供端到端类型的API,无需使用任何码内或其他人造机械.

干燥VS Intent

保持干燥不应该与明确说明的意图混淆,您应该避免尝试干燥或隐藏继承,魔术属性或任何其他机制.具有清洁,定义的DTO提供单一的参考来源,即任何人都可以查看每个服务接受和返回,它允许您的客户端和服务器开发人员直接开始工作并绑定到外部服务模型而不实现写过.

保留DTOS分离也使您自由地从内部重新定位实现,而不破坏外部客户端,即您的服务开始缓存响应或利用NoSQL解决方案填充您的响应.

还提供了用于创建自动生成元数据页面,示例响应,摇摇欲坠支持,XSDS,WSDL等的权威性源(内部未泄露或耦合在您的应用程序逻辑内).

使用servicestack的内置自动映射

虽然我们鼓励保持单独的DTO模型,但您无需维护自己的手动映射,因为您可以使用像 automapper 或使用Servicestack内置自动映射支持,例如:

创建一个新的dto实例,填充viewmodel上的匹配属性:

var dto = viewModel.ConvertTo<MyDto>();

初始化DTO并填充视图模型上的匹配属性:

var dto = new MyDto { A = 1, B = 2 }.PopulateWith(viewModel);

初始化dto并使用 non-default 匹配属性在视图模型上匹配:

var dto = new MyDto { A = 1, B = 2 }.PopulateWithNonDefaultValues(viewModel);

初始化dto并填充它,匹配属性在视图模型上与 attr 属性注释:

var dto = new MyDto { A=1 }.PopulateFromPropertiesWithAttribute<Attr>(viewModel);

当映射逻辑变得更加复杂,我们喜欢使用扩展方法,使代码干燥并在从应用程序中易于消耗的一个地方维护映射,例如:

public static class MappingExtensions
{
    public static MyDto ToDto(this MyViewModel viewModel)
    {
        var dto = viewModel.ConvertTo<MyDto>();        dto.Items = viewModel.Items.ConvertAll(x => x.ToDto());
        dto.CalculatedProperty = Calculate(viewModel.Seed);
        return dto;
    }
}

现在可以轻松消耗:

var dto = viewModel.ToDto();

其他推荐答案

如果您没有专门绑定服务并只需要”全功能服务,以支持程序化客户端……我们已经拥有的东西”,您可以尝试以下操作:让控制器返回a ViewResult或者基于请求的接受标题 – Request.AcceptTypes.Contains(“text/html”)或Request.AcceptTypes.Contains(“application/json”)的JsonResult.

两个ViewResult和JsonResult是ActionResult,因此动作的签名保持不变,并且两个View()和Json()接受视图.此外,如果您有一个ControllerBase,您可以制作一个基本方法(例如protected ActionResult RespondWith(Object viewModel)),调用视图()或json(),因此对现有代码的更改最小.

当然,如果您的视图显示不纯(即,有一些特定于HTML的东西或者您依赖一些Viewbag魔术),那么它就会有点工作.而且您将不会获得SERMICESTACK提供的SOAP或其他绑定类型,但如果您的目标是支持具有最小代码的JSON数据接口对现有MVC应用程序的更改,那么这可能是一个解决方案.

lp

以上所述是小编给大家介绍的服务栈新服务并列的ASP.NET MVC网站,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34233.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。