我尝试了很多与无扩展和现在我试图让我在其中可以排队程序和任何方式我希望同时能够执行它们的系统向用户发送通知。拍摄动作<T>的通用调度与无扩展
我现在有我的数据库访问封装暴露添加用户的方法UserAccess类中。在那个方法中,我想排列一个将用户添加到数据库的操作。所以我做了一个T类的JobProcessor,它公开了一个方法QueueJob(Action)并让我的用户实现了这个类。我的问题是我看不到如何从Observable的OnNext方法内调用Action,因为该操作需要用户参数。
我的攻角必须是错误的,都必须有我的设计的把握问题。例如,我知道我应该以某种方式将我的用户传递给QueueJob过程,但我不知道如何以干净的方式进行操作。
public class UserAccess : JobProcessor<User>
{
public void AddUser(User user)
{
QueueJob(usr =>
{
using (var db = new CenterPlaceModelContainer())
{
db.Users.Add(usr);
}
});
[...]
public abstract class JobProcessor<T>
{
// Either Subject<T> or Subject<Action<T>>
private Subject<Action<T>> JobSubject = new Subject<Action<T>>();
public JobProcessor()
{
JobSubject
/* Insert Rx Operators Here */
.Subscribe(OnJobNext, OnJobError, OnJobComplete);
}
private void OnJobNext(Action<T> action)
{
// ???
}
private void OnJobError(Exception exception)
{
}
private void OnJobComplete()
{
}
public void QueueJob(Action<T> action)
{
JobSubject.OnNext(action);
}
}
编辑1:
我试图QueueJob的签名更改为
QueueJob(T entity, Action<T> action)
现在我能做的
QueueJob(user, usr => { ... });
,但它似乎不是很直观。我还没有看到你通过实体和动作的许多框架。因此,我可能不需要JobProcessor。
编辑2: 我改变了我的JobProcessor的主题类型,主题,完全移除吨。由于我不需要在程序中包含用户,因为我可以在外部引用它。现在唯一的问题是,如果用户传递给QueueJob的动作在Action执行的实际时间之间发生变化,那么用户将获得修改后的信息。不受欢迎,但我想我会继续寻找解决方案。
我的代码现在(用于缓冲样品):
public abstract class JobProcessor
{
public Subject<Action> JobSubject = new Subject<Action>();
public JobProcessor()
{
JobSubject
.Buffer(3)
.Subscribe(OnJobNext, OnJobError, OnJobComplete);
}
private void OnJobNext(IList<Action> actionsList)
{
foreach (var element in actionsList)
{
element();
}
}
private void OnJobError(Exception exception)
{
}
private void OnJobComplete()
{
}
public void QueueJob(Action action)
{
JobSubject.OnNext(action);
}
}
事实上,我想我可能需要一些指导,因此我的问题在这里。不过,我希望有一个我可以处理的行为队列。可能是每秒一次或者仅仅累计10秒的动作,而他们只处理其中的一半,而忽略其余部分。我还希望能够通知何时正在处理某个操作,并将其通知给谁订阅。这就是为什么我想到用OnNext和User信息的序列。 – 2013-03-26 01:13:59
......你在一个很好的轨道上,只是重新组织一下 - 然后我不知道问一些具体的问题,这对我来说太笼统了。在'Throttle' - 你可以用它积累更多或类似的东西(这里有几种方法) – NSGaga 2013-03-26 01:21:04
@Lououx我想我明白你的意思 - 我会尝试稍后在 – NSGaga 2013-03-26 14:51:18