C# ServiceStack:解析未知类型的服务
我有以下情况: 我的服务需要处理不同类型的任务,每个任务都有自己的服务类。应该有一个REST路径/tasks/(GenericTasksService)来访问它们,还有其他特定路径,如/tasks/specifictask/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; } }
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),但至少它可以工作