-1

件名を使用せずに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 MemberAddedを初期化する方法がわかりません。これは、Subjectバッカーがない場合は常にnullであり、後で関数からOnNextを呼び出す方法もわかりません。

最後に、オブザーバブルを静的プロパティとして、すべてのサブスクリプションコードを1か所にまとめることは問題ですか?

4

1 に答える 1

2

私が似たようなものを実装した方法は、通常の C# イベントMemberAddedを myに公開することMemberRepositoryです。Observable.FromEventor 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!));

2 番目の質問に関しては、静的プロパティを避ける必要があります。代わりに、イベント アグリゲーターパターンのようなものを使用することを検討してください。

于 2013-02-01T17:22:25.893 に答える