1

所以我的问题围绕着调用 apphost.ResolveService 在下面的 url 中描述: Calling a ServiceStack service from Razor

我在我的 _Layout.cshtml

显然,以下代码可以完美运行,但正如上述网址中的答案所建议的那样,这有点愚蠢

SMSGateway.Services.EntityCollectionResponse response = 
    new ServiceStack.ServiceClient.Web.JsonServiceClient(
        "http://localhost:1337/")
        .Get<SMSGateway.Services.EntityCollectionResponse>(
            "/entities");

所以这给了我一个实体列表:)但不是最优的......所以这是我尝试以正确的方式做到这一点

var response = ConsoleAppHost.Instance
    .ResolveService<SMSGateway.Services.EntityService>(
        HttpContext.Current).Get(
            new SMSGateway.Services.EntitiesRequest());

// SMSGateway.Services.EntityCollectionResponse response =
//     base.Get<SMSGateway.Services.EntityService>().Get(
//         new SMSGateway.Services.EntitiesRequest());

foreach (var entity in response.Result)
{
    <li>
        <a href="@entity.MetaLink.Href">
            @Html.TitleCase(entity.Name) entities
        </a>
    </li>
}

好的,我得到的错误如下:

错误 CS0122:ConsoleAppHost 由于其保护级别而无法访问....

这是预期的吗?我在思考这是否不是我可能不允许在 _Layout.cshtml 文件中调用它的情况?

进一步阅读让我看到了文章InternalVisibleTo 在 .NET 2.0 中测试内部方法

我觉得很有趣 :P 但没有雪茄 :)

4

1 回答 1

5

我建议您不要在 Razor 模板中调用服务。Razor 模板应仅用于渲染模型中的某些标记。

实际数据访问应在呈现此模板的 ServiceStack 服务中执行。因此,在您的情况下,您可以从操作中调用另一个服务:

public object Get(SomeRequestDto message)
{
    var response = this
        .ResolveService<SMSGateway.Services.EntityService>()
        .Get(new SMSGateway.Services.EntitiesRequest()
    );

    return response.Rersult;
}

或者您可能会离开容器将依赖服务注入当前服务,这样您甚至不需要使用某些服务定位器反模式。

public SomeService: Service
{
    private readonly EntityService entityService;
    public SomeService(EntityService entityService)
    {
        this.entityService = entityService;
    }

    public object Get(SomeRequestDto message)
    {
        var response = this.entityService.Get(new SMSGateway.Services.EntitiesRequest()

        return response.Rersult;
    }
}

然后你的 Razor 视图当然会被强类型化为相应的模型:

@model IEnumerable<WhateverTheTypeOfTheResultYouWannaBeLoopingThrough>
foreach (var entity in Model)
{
    <li>
        <a href="@entity.MetaLink.Href">
            @Html.TitleCase(entity.Name) entities
        </a>
    </li>
}
于 2013-07-10T07:08:35.723 回答