私は比較的 ServiceStack に慣れていませんが、これまで見てきたものは気に入っています。しかし、これで壁にぶつかりました。
これは私のかみそりのテンプレートがどのように見えるかです -
@inherits ViewPage<IChallenge>
@{
foreach (var codeFile in Model.CodeFiles)
{
//do something here
}
}
ここで、IChallenge はインターフェイスであり、サービスは戻るときにこのインターフェイスの特定の実装を動的に選択します。サービスは、インターフェイス自体を返すように配線されています-
public class WebChallenge : IReturn<IChallenge> { /* properties */ }
ただし、コードを実行すると次のエラーが発生します-
タイプ 'ServiceStack.Razor.Compilation.RazorDynamicObject' を 'IChallenge' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)
これをフルスタックのレスポンスとして -
<?xml version="1.0"?>
<Challenge1Response xmlns="" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ResponseStatus>
<ErrorCode>RuntimeBinderException</ErrorCode>
<Message>Cannot implicitly convert type 'ServiceStack.Razor.Compilation.RazorDynamicObject' to 'CodeGuru.Exercises.IChallenge'. An explicit conversion exists (are you missing a cast?)</Message>
<StackTrace> at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at ServiceStack.Razor.Templating.TemplateBase`1.get_Model()
at CompiledRazorTemplates.Dynamic.faaccadc.Execute()
at ServiceStack.Razor.Templating.TemplateService.ExecuteTemplate[T](T model, String name, String defaultTemplatePath, IHttpRequest httpReq, IHttpResponse httpRes)
at ServiceStack.Razor.RazorFormat.ExecuteTemplate[T](T model, String name, String templatePath, IHttpRequest httpReq, IHttpResponse httpRes)
at ServiceStack.Razor.RazorFormat.ProcessRazorPage(IHttpRequest httpReq, ViewPageRef razorPage, Object dto, IHttpResponse httpRes)
at ServiceStack.Razor.RazorFormat.ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, Object dto)
at ServiceStack.WebHost.Endpoints.Formats.HtmlFormat.<>c__DisplayClass1.<SerializeToStream>b__0(IViewEngine x)
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
at ServiceStack.WebHost.Endpoints.Formats.HtmlFormat.SerializeToStream(IRequestContext requestContext, Object response, IHttpResponse httpRes)
at ServiceStack.WebHost.Endpoints.Extensions.HttpResponseExtensions.WriteToResponse(IHttpResponse response, Object result, ResponseSerializerDelegate defaultAction, IRequestContext serializerCtx, Byte[] bodyPrefix, Byte[] bodySuffix)
</StackTrace>
</ResponseStatus>
</Challenge1Response>
特定の実装を使用すると、このエラーは消えますが、実行時に選択した実装を送信できる必要があります。何か案は?
編集:
Interface が別の厳密に型指定されたオブジェクトのプロパティとしてラップされ、そのオブジェクトがビューでモデルとして使用されている場合、それは正常に機能し、Interface プロパティにもアクセスできることに気付きました。これは回避策になる可能性がありますが、誰かがより良い答えを知っているかどうか知りたいです。