如何在不使用主题的情况下在 RX 中实现这种情况。我读了很多书,但我似乎想不通
public class Member
{
public int Id { get; private set; }
public string Email { get; private set; }
public Member(string email)
{
this.Email = email;
}
}
public class MemberRepository
{
public void AddMember(Member member)
{
// save member
memberAdded.OnNext(member);
}
private Subject<Member> memberAdded = new Subject<Member>();
public IObservable<Member> MemberAdded { get { return memberAdded.AsObservable(); } }
}
public class MemberController
{
public void Create(Member item)
{
var repository = new MemberRepository();
var subs = repository.MemberAdded.Subscribe(x => SendMail(x));
repository.AddMember(item);
}
private void SendMail(Member value)
{
// send welcome mail
}
}
我不知道如何初始化 IObservable MemberAdd,因为如果它没有主题支持者,它总是为空,我也不知道以后如何从后面的函数调用 OnNext at。
最后,将可观察量作为静态属性并将所有订阅代码放在一个地方是否有问题?
我实现类似东西的方式是在我的MemberRepository
上公开一个正常的 C# 事件MemberAdded
。然后,您可以使用Observable.FromEvent
或Observable.FromEventPattern
(区别在这里)订阅事件,如下所示:
public class MemberRepository
{
public void AddMember(Member member)
{
// save member
if (MemberAdded != null)
MemberAdded(new MemberEventArgs(member, MemberEvent.Add));
}
public event EventHandler<MemberEventArgs> MemberAdded;
}
...
Observable.FromEventPattern<MemberEventArgs>(h => memberRepository.MemberAdded += h,
h => memberRepository.MemberAdded -= h)
.Select(e => e.Member)
.Subscribe(m => Console.WriteLine("Member "+m+" added!));
关于第二个问题,您应该避免静态属性 - 考虑使用类似事件聚合器模式的东西