servicestack,C#,servicestack" /> servicestack,C#,servicestack" />

C# ServiceStack:解析未知类型的服务

C# ServiceStack:解析未知类型的服务,c#,servicestack,C#,servicestack,我有以下情况: 我的服务需要处理不同类型的任务,每个任务都有自己的服务类。应该有一个REST路径/tasks/(GenericTasksService)来访问它们,还有其他特定路径,如/tasks/specifictask/ public class Task { public string taskId { get;} } public class SpecificTask : Task { public string specificProperty { get; set; } }

我有以下情况: 我的服务需要处理不同类型的任务,每个任务都有自己的服务类。应该有一个REST路径/tasks/(GenericTasksService)来访问它们,还有其他特定路径,如/tasks/specifictask/

public class Task
{
  public string taskId { get;}
}

public class SpecificTask : Task
{
  public string specificProperty { get; set; }
}
我的想法是向GenericTaskService注册特定服务,如下所示:

public class GenericTasksService : Service
{
  private static List<ITaskService> taskServices = new List<ITaskService>();

  public static void RegisterTaskService(ITaskService ts) { this.taskServices.Add(ts);}

  public List<Task> Get(GetAllTasks gat) 
  {
     List<Task> tasks = new List<Task>();

     foreach(ITaskService ts in this.taskServices)
        tasks.Add(ts.GetAllTasks());

     return tasks;
  }
}

public class SpecificTaskService : ITaskService
{
   //from ITaskService
   List<Task> GetAllTasks()
   {
     //access Repository and return the List
   }

   //SpecificTask-implementation would follow here
}
public static void RegisterTaskServiceType(System.Type t)
    {
        Type iface = t.GetInterface("itaskservice",true);

        if (iface == null)
            throw new ArgumentException("Type-Argument needs to implement ITaskService.");
        else if (taskServiceTypes.Contains(t))
            throw new InvalidOperationException(string.Format("Type {0} is already registered.",t.FullName));
        else
            taskServiceTypes.Add(t);
    }
问题是,请求上下文不是由ServiceStack设置的,因此我没有访问会话的权限。(它是空的)

另一个选择是在GenericTaskService中使用ResolveService,但是如果不知道具体的类型,我不知道如何做到这一点

在AppHostBase.Configure中注册TaskServices时,我还尝试使用AppHostBase.ResolveService(HttpContext httpcx),但当时我不知道从哪里获取RequestContext

这是我在stackoverflow的第一篇文章,我希望我没有忽略一些惯例 提前感谢您的帮助或建议


Steffen

我通过注册类型而不是像这样的实例来帮助自己:

public class GenericTasksService : Service
{
  private static List<ITaskService> taskServices = new List<ITaskService>();

  public static void RegisterTaskService(ITaskService ts) { this.taskServices.Add(ts);}

  public List<Task> Get(GetAllTasks gat) 
  {
     List<Task> tasks = new List<Task>();

     foreach(ITaskService ts in this.taskServices)
        tasks.Add(ts.GetAllTasks());

     return tasks;
  }
}

public class SpecificTaskService : ITaskService
{
   //from ITaskService
   List<Task> GetAllTasks()
   {
     //access Repository and return the List
   }

   //SpecificTask-implementation would follow here
}
public static void RegisterTaskServiceType(System.Type t)
    {
        Type iface = t.GetInterface("itaskservice",true);

        if (iface == null)
            throw new ArgumentException("Type-Argument needs to implement ITaskService.");
        else if (taskServiceTypes.Contains(t))
            throw new InvalidOperationException(string.Format("Type {0} is already registered.",t.FullName));
        else
            taskServiceTypes.Add(t);
    }
在我的任何Get方法中,我现在通过使用反射调用ResolveService方法来解析服务(如果还没有解析的话)

我需要实现更多的检查(Type还需要实现ServiceStack.ServiceInterface.Service),但至少它可以工作