1

したがって、私の問題は、以下の URL で説明されている apphost.ResolveService の呼び出しを中心に展開しています: Calling a ServiceStack service from Razor

私は_Layout.cshtmlにいます

そして明らかに、次のコードは完全に機能しますが、上記のURLの回答で示唆されているように、それはちょっとばかげています

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 Testing Internal Methods in .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 に答える