3

我试图弄清楚如何从 asp mvc4 控制器调用服务,但我就是做不到。我已经设置了服务,但是当我尝试从我的控制器方法调用时,它会显示:

http://s10.postimg.org/5ojcryn7t/error_1.png

这是我的代码:

全球.asax.cs

namespace mvc4_servicestack
{
// Nota: para obtener instrucciones sobre cómo habilitar el modo clásico de IIS6 o IIS7, 
// visite http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {

        public class AppHost : AppHostBase
        {
            public AppHost()
                : base("Nombre del Host de los WebService", typeof(SS_WebServices.StatusService).Assembly)
            { }

            public override void Configure(Funq.Container container)
            {

            }



        }

        protected void Application_Start()
        {

            new AppHost().Init();

            AreaRegistration.RegisterAllAreas();

           // WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();


        }
    }
}

SS_WebServices.cs

命名空间 mvc4_servicestack { 公共类 SS_WebServices {

    //Request DTO Objet
    [ServiceStack.ServiceHost.Route("/Home/About/statuss")]
    [ServiceStack.ServiceHost.Route("/Home/About/statuss/{Name}")]
    public class StatusQuery : ServiceStack.ServiceHost.IReturn<StatusResponse>
    {
        public string Name { get; set; }
        public int Id { get; set; }

    }

    //Response DTO Object
    public class StatusResponse
    {
        public string Result { get; set; }
    }


    //Service
    public class StatusService : ServiceStack.ServiceInterface.Service
    {
        //Implement teh Method VERB (POST,GET,PUT,DELETE) OR Any for ALL VERBS
        public object Any(StatusQuery request)
        {
            //Looks strange when the name is null so we replace with a generic name.
            var name = request.Name ?? "John Doe";
            return new StatusResponse { Result = "Hello, " + name };
        }
    }


}

}

我一直在阅读帖子ServiceStack 应该是 MVC 应用程序中的服务层还是应该调用服务层?

但我仍然无法理解以下内容:为什么注册返回一个接口而不是一个 GreeterResponse?container.Register(c => new Greeter());

我真的希望你们能帮助我......!

4

1 回答 1

3

由于 ServiceStack 与 MVC 托管在同一个 AppDomain 中,因此您无需使用 ServiceClient 并通过 HTTP 访问 ServiceStack 服务,而是可以正常解析和调用服务,例如:

public HelloController : ServiceStackController 
{
    public void Index(string name) 
    {
        using (var svc = base.ResolveService<HelloService>())
        {
           ViewBag.GreetResult = svc.Get(name).Result;
           return View();
        }
    }        
}

在控制器之外,可以通过以下方式解析 ServiceStack 服务HostContext.ResolveService<T>()

有关更多信息,请参阅MVC 集成文档

但我仍然无法理解以下内容:为什么注册返回一个接口而不是一个 GreeterResponse?container.Register(c => new Greeter());

Greeter 只是一个普通的 C# 依赖项(即它不是 ServiceStack 服务)。容器没有返回IGreeter这里,而是说“针对 IGreeter 接口注册 Greeter 实现”:

container.Register<IGreeter>(c => new Greeter());

如果您没有注册它,它只会针对具体类型注册,例如,它们都是等价的:

container.Register(c => new Greeter());
container.Register<Greeter>(c => new Greeter());

这意味着您需要指定具体的依赖项以使其自动连接,例如:

public class MyService : Service 
{
    public Greeter Greeter { get; set; }
}

而不是能够使用:

    public IGreeter Greeter { get; set; }

考虑到它是一个可模拟的接口,它更容易测试。

于 2013-10-08T18:10:23.913 回答