Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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
Asp.net mvc ServiceStack新服务并排ASP.NET MVC网站_Asp.net Mvc_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,Asp.net Mvc,servicestack" /> servicestack,Asp.net Mvc,servicestack" />

Asp.net mvc ServiceStack新服务并排ASP.NET MVC网站

Asp.net mvc ServiceStack新服务并排ASP.NET MVC网站,asp.net-mvc,servicestack,Asp.net Mvc,servicestack,在for ServiceStack中,我没有看到一个应用程序首先是ASP.NET MVC网站,然后是ServiceStack服务 让我们看一个非常简单的ASP.NET MVC web应用程序,它通过视图呈现产品。它使用控制器、视图、模型和视图模型 假设我们有一个Product模型,它被持久化到文档数据库中。假设我们有一个视图模型ProductViewModel,它从Product映射并显示在MVC Razor视图/PartialView中 这是一个web方面的东西。现在让我们假设我们想添加一个服

在for ServiceStack中,我没有看到一个应用程序首先是ASP.NET MVC网站,然后是ServiceStack服务

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

假设我们有一个
Product
模型,它被持久化到文档数据库中。假设我们有一个视图模型
ProductViewModel
,它从
Product
映射并显示在MVC Razor视图/PartialView中

这是一个web方面的东西。现在让我们假设我们想添加一个服务,将产品返回到各种客户端,如Windows 8应用程序

请求/响应类是否应该与我们已有的类完全断开连接?我们的
ProductViewModel
可能已经包含了我们想要从服务返回的所有内容

由于我们已经有了
Product
(模型类),我们不能在API名称空间中有另一个
Product
类。我们可以,但这会让事情变得不清楚,我希望避免这种情况

那么,我们是否应该在API名称空间中引入独立的
ProductRequest
类和
ProductRequestResponse
(继承ProductViewModel)类

像这样
ProductRequestResponse:ProductViewModel

我想说的是,我们已经有了Model和ViewModel类,要为SS服务构建请求和响应类,我们必须创建另外两个文件,主要是通过复制我们已经拥有的类中的所有内容。这在我看来并不枯燥,它可能遵循关注点分离的指导原则,但枯燥也很重要,实际上比分离所有内容更重要(分离所有内容会导致代码重复)

我想看到的是一个已经制作好的web应用程序,它当前具有模型和视图模型,并返回适当的视图以在web上显示,但可以扩展为一个功能齐全的服务来支持编程客户端?像AJAX客户机等等…我们已经有了

还有一件事:

如果你看看这个例子

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

现在,虽然我喜欢SS方法处理服务,我认为它是正确的,但我不喜欢这种分离仅仅因为请求的类型。如果我想要导演的电影呢?我会发明另一个请求类,它有一个
Director
属性和另一个服务(
MoviesByDirector

我认为样品应该面向一种服务。所有与电影有关的东西都必须放在同一个屋檐下。如何使用ServiceStack实现这一点

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;
    }
}
公共类产品服务:服务
{
私有只读IDocumentSession\u会话;
私有只读产品服务(ProductsHelperService);;
私有只读ProductCategorizationHelperService\u productCategorization;
公共类ProductRequest:IReturn
{
公共int Id{get;set;}
}
//这有意义吗
//请注意,我们在视图中使用ProductViewModel,它还包含我们在服务响应中需要的所有内容
公共类ProductRequestResponse:ProductViewModel
{
}
public ProductRequestResponse GetProducts(ProductRequest请求)
{
ProductRequestResponse=null;
如果(request.Id>=0)
{
var product=\u session.Load(request.Id);
(产品)的响应;
}
返回响应;
}
}
服务层是您最重要的合同 您可以在整个系统中创建的最重要的接口是面向外部的服务契约,这是您的服务或应用程序的使用者将绑定到的接口,即现有的调用站点,它们通常不会随着您的代码库一起更新—其他模型都是次要的

DTO是远程服务的最佳实践 在下面的远程服务()的(数据传输对象)中,鼓励使用干净、无污染的POCO来定义一个定义良好的契约,该契约应该保存在一个基本上没有依赖关系的实现中。这样做的好处是,您可以重用用于定义服务的类型化DTO,就像在您的系统中一样,提供端到端类型化API,而无需使用任何代码生成器或其他人工机器

干巴巴的vs意图 保持事物干燥不应与明确的意图相混淆,你应该避免尝试干燥、魔法属性或任何其他机制。干净、定义良好的DTO提供了一个单一的参考源,任何人都可以查看每个服务接受和返回的内容,它允许客户机和服务器开发人员直接开始工作,并绑定到外部服务模型,而无需编写实现

保持DTO分离还可以让您自由地从内部重新考虑实现,而不会中断外部客户端,即您的服务开始缓存响应或利用NoSQL解决方案填充响应

它还提供了用于创建自动生成的元数据页、示例响应、招摇过市支持、XSD、WSDL等的权威源(在应用程序逻辑中没有泄漏或耦合)

虽然我们鼓励保留单独的DTO模型,但您不需要维护自己的手动映射,因为您可以使用类似映射器的映射器或使用ServiceStack内置的自动映射支持,例如:

创建一个新的DTO实例,
var dto = viewModel.ConvertTo<MyDto>();
var dto = new MyDto { A = 1, B = 2 }.PopulateWith(viewModel);
var dto = new MyDto { A = 1, B = 2 }.PopulateWithNonDefaultValues(viewModel);
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();