2

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

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

public class SpecificTask : Task
{
  public string specificProperty { get; set; }
}

我的想法是使用 GenericTasksService 注册特定的服务,如下所示:

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
}

然后我想通过调用在 AppHost.Configure 中注册我的服务

GenericTasksService.RegisterTaskService(new SpecificTaskService());

这个问题是afaik,请求上下文不是由ServiceStack设置的,所以我无权访问会话。(为空)

另一种选择可能是在 GenericTaskService 中使用 ResolveService<T>,但我不知道如何在不知道具体类型的情况下执行此操作。

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

这是我在 stackoverflow 上的第一篇文章,我希望我没有忽略一些约定。;) 提前感谢您的帮助或建议。

史蒂芬

4

1 回答 1

1

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

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-Methods 中,我现在通过使用反射调用 ResolveService<T>-方法来解决服务 - 如果尚未完成的话。

private void ResolveTaskServices()
{
    if (!servicesResolved)
    {
      foreach (Type t in taskServiceTypes)
        {
          //Resolve Service via Reflection and add it to the List of Services
          MethodInfo MethodObj = typeof(TasksService).GetMethod("ResolveService");
          MethodInfo GenericMethodObj = MethodObj.MakeGenericMethod(t);
          taskServices.Add((ITaskService)GenericMethodObj.Invoke(this, new object[] { }));
        }

      servicesResolved = true;
    }
}

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

于 2013-09-11T07:14:27.890 回答