并排ASP.NET MVC网站ServiceStack新的服务端(ServiceStack new

2019-07-21 11:01发布

在实例为ServiceStack我没有看到一个单一的应用程序,ASP.NET MVC的网站,然后再做出ServiceStack服务第二。

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

比方说,我们有一个模型Product ,其被持续到文档DB。 假设我们有一个视图模型ProductViewModel它会从映射的Product和显示MVC Razor视图/ PartialView内。

所以这是things..now假设我们要添加一个服务退回产品的各种客户喜欢Windows 8的应用程序的网络侧。

如果请求/响应等级从我们已经彻底断开? 我们ProductViewModel可能已经包含我们想从服务返回的一切。

既然我们已经有了Product (模型类),我们不能再有一个Product的API类namespace..well我们可以但使事情不清楚,我想避免这种情况。

因此,我们应引入独立ProductRequest类和ProductRequestResponse (继承ProductViewModel)在API命名空间中的类?

像这样ProductRequestResponse : ProductViewModel

我想说的是,我们已经拥有了模型和视图模型类和构建Request和Response类的SS服务,我们将不得不创建另一个两个文件,主要是通过复制一切从我们已有的类。 这看起来并不干了,它可能遵循的准则担忧的分离,但DRY也很重要,其实比分离的一切(分离一切导致重复的代码)以上。

我想看到的是,其中一个Web应用程序已经作出,但目前功能模型和的ViewModels,并返回相应的视图显示在Web上,但可以扩展成一个功能齐全的服务,以支持客户程序的情况下? 像AJAX客户端等......与我们所拥有。

另一件事:

如果你看看这个例子https://github.com/ServiceStack/ServiceStack.Examples/blob/master/src/ServiceStack.MovieRest/MovieService.cs

你会看到有Movie Request类和Movies Request类(一个单电影的要求,另外一个电影的列表)。 因此,也有两个服务, MovieServiceMoviesService ,一个交易与一个单一的电影,另一部分用于电影的流派的请求。

现在,虽然我喜欢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;
    }
}

Answer 1:

服务层是你最重要的合同

你都不能创建在整个系统中最重要的接口是外部饰面服务合同,这是您的服务或应用程序的用户将绑定到,即现有的调用点,往往不会得到你的代码一起更新碱基 - 所有其他模式是次要的。

DTO的是远程服务的最佳实践

在下面的Martin Fowler的推荐使用的DTO (数据传输对象)的远程服务( MSDN ), ServiceStack鼓励使用清洁,无污点波苏斯的定义与应存放在很大程度上实现和无依赖,一个明确的合同。 DLL。 这样做的好处可以让你能够再利用类型用来与定义服务,-是,在你的DTO的C#/。NET的客户。 -无需使用任何代码-的提供终端到终端的输入API根或其他人工机械。

DRY VS意向

让事情干不应该讲明意图,你应该避免干燥或混淆躲在继承 ,魔法属性或任何其他机制。 有个整洁的,定义明确的DTO提供参考,任何人都可以看看,看看每个服务接受并返回一个单一来源,它可以让你的客户端和服务器开发者开始他们的工作马上和绑定到外部服务模式,而不执行其被写入。

保持DTO的分离也让你自由地重新因数实施从内而不会破坏外部客户,即你的服务开始缓存响应或利用了的NoSQL解决方案与填充你的反应。

它也提供了权威源(这是不被泄漏或耦合应用程式逻辑内),其被用于创建自动生成的元数据的页面,例如响应,扬鞭支持,的XSD,WSDL中,等

使用ServiceStack内置的自动映射

虽然我们鼓励保持独立的DTO模式,你不需要维护自己的手动映射,你可以使用一个像映射AutoMapper或使用ServiceStack内置的自动映射支持,如:

创建一个新的DTO的实例,填充在视图模型匹配的属性:

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

初始化DTO并与视图模型匹配性来填充它:

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

初始化DTO并与视图模型非默认的匹配性来填充它:

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();


Answer 2:

如果你并不特别依赖于ServiceStack只想“全功能服务支持计划的客户...什么我们已经有了”,你可以尝试以下方法:让你的控制器返回一个ViewResultJsonResult基于请求的接受头- Request.AcceptTypes.Contains("text/html")Request.AcceptTypes.Contains("application/json")

双方ViewResultJsonResultActionResult ,所以行动的签名仍然是相同的,并且两个View()Json()接受一个视图模型。 此外,如果你有一个ControllerBase你可以做一个基础的方法(例如protected ActionResult RespondWith(Object viewModel) ),这就要求无论是查看()或JSON(),所以改变现有的代码是最小的。

当然,如果你的ViewModels不是纯粹的(即具有一些特定的HTML的东西,否则你依靠一些ViewBag魔术),那么这是一个有点更多的工作。 你不会得到SOAP或ServiceStack提供的其他绑定类型,但如果你的目标是支持最少的代码更改现有的MVC应用程序一个JSON数据接口,那么这可能是一个解决方案。

唱片



文章来源: ServiceStack new service side by side ASP.NET MVC website