我在使用策略模式时遇到了一个问题.我正在实现创建任务的服务.此服务还解决了此任务的负责人员.解决职员是通过使用策略模式来完成的,因为有不同的方法可以做到这一点.关键是每个策略都需要不同的参数来解决职员.
例如:
interface ClerkResolver {
String resolveClerk(String department);
}
class DefaultClerkResolver implements ClerkResolver {
public String resolveClerk(String department) {
// some stuff
}
}
class CountryClerkResolver implements ClerkResolver {
public String resolveClerk(String department) {
// I do not need the department name here. What I need is the country.
}
}
Run Code Online (Sandbox Code Playgroud)
问题是每个解析器可能依赖于不同的参数来解决负责的职员.对我来说,这听起来像是我的代码中的设计问题.我还尝试将一个类作为参数来保留策略可能需要的所有值,例如:
class StrategyParameter {
private String department;
private String country;
public String getDepartment() ...
}
interface ClerkResolver {
String resolveClerk(StrategyParameter strategyParameter);
}
Run Code Online (Sandbox Code Playgroud)
但说实话,我对这个解决方案并不满意,因为每当策略需要一个新的/不同的参数时我就必须更改参数类.其次,策略的调用者必须设置所有参数,因为他不知道哪个策略将解析职员,因此他必须提供所有参数(但这并不是那么糟糕).
同样,对我而言,这听起来像我的代码中的设计问题,但我找不到更好的解决方案.
---编辑
此解决方案的主要问题是创建任务时.任务服务如下所示:
class TaskService { …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个可以在远程服务器中创建任务计划的程序。以下代码适用于本地机器,但是当我在远程服务器上尝试时,它会引发以下错误。
System.Runtime.InteropServices.COMException: '不支持该请求。(来自 HRESULT 的异常:0x80070032)'
void SetupDailyTask()
{
using (TaskService ts = new TaskService("servername.us.xxxxxdomain.com",
@"domainname\username","domainname","password"))
{
//Task tsk = ts.GetTask("DailyTask");
//if (tsk != null) { ts.RootFolder.DeleteTask("DailyTask"); }
//DateTime dt = DateTime.Now;
//TimeSpan tsp = new TimeSpan(12, 44, 0);
//dt = dt.Date + tsp;
//ts.Execute("notepad.exe").Once().Starting(dt).AsTask("DailyTask");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经测试了凭据、服务器名称等,它们与远程桌面连接一起工作得很好。我正在使用Microsoft.Win32.TaskScheduler命名空间。非常感谢您对此的任何帮助。