2013-07-09 8 views
1

Так что моя проблема вращается вокруг вызова apphost.ResolveService описано ниже URL: Calling a ServiceStack service from RazorServiceStack ResolveService

Я в моем _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 Но не сигару :)

+0

Я ищу что-то, что позволит мне использует другой «RenderBody» .... Потому что в _layout.cshtml Кажется, я не могу получить информацию/модель с моих сервисов, если я не позвоню «RenderBody», и это само по себе позволяет использовать только одну модель для каждого представления ... так как я могу дать разные модели для моего макета? Именно по этой причине я решил использовать JSONClient в Razor .... –

ответ

5

Я бы порекомендовал вам не вызывая услуги в шаблоне Razor. Шаблон Razor следует использовать только для рендеринга некоторой разметки из модели.

Фактический доступ к данным должен выполняться в службе ServiceStack, которая отображает этот шаблон. Так что в вашем случае можно вызвать другую услугу из эксплуатации:

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

    return response.Rersult; 
} 

или вы можете оставить контейнер, чтобы придать зависимую службу в текущей службы, так что вам даже не нужно использовать некоторые службы локатора анти -patterns.

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; 
    } 
} 

, а затем ваш взгляд Бритва, естественно, будет сильно типизированных к соответствующей модели:

@model IEnumerable<WhateverTheTypeOfTheResultYouWannaBeLoopingThrough> 
foreach (var entity in Model) 
{ 
    <li> 
     <a href="@entity.MetaLink.Href"> 
      @Html.TitleCase(entity.Name) entities 
     </a> 
    </li> 
} 
Смежные вопросы