-1

how can i implement this situation in RX without using subject. I've read a lot, and I just can't seem to figure it out

    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
    }
}

I've don't know how to initialize the IObservable MemberAdded because it is always null if it doesn't have the Subject backer nor do I know how to later call the OnNext at from a later function.

Lastly, is it a problem to have the observables as static properties and all the subscription code in one place?

svick
  • 236,525
  • 50
  • 385
  • 514
user10479
  • 790
  • 2
  • 9
  • 22

1 Answers1

2

The way I have implemented something similar is to expose a normal C# event MemberAdded on my MemberRepository. You can then use Observable.FromEvent or Observable.FromEventPattern (the difference is here) to subscribe to the event something like this:

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!));

In regard to your second question, you should avoid static properties - consider using something like the Event Aggregator pattern instead

Community
  • 1
  • 1
Alex
  • 7,639
  • 3
  • 45
  • 58