2

私はこれまで流暢なコードスタイルを使用したことはありません。したがって、C#プロパティ宣言を使用して流暢なスタイルで何かを開発しようとしたのはこれが初めてですが、エラーが発生します。誰か助けてもらえますか?

public class MailTemplate
{
    string _MailBody = "";
    public MailTemplate MailBody
    {
        get { return _MailBody; }
        set { _MailBody = value ; }
    }

    string _Subject = "";
    public MailTemplate Subject
    {
        get { return _Subject; }
        set { _Subject = value; }
    }

    string _MailFrom = "";
    public MailTemplate MailFrom
    {
        get { return _MailFrom; }
        set { _MailFrom = value; }
    }
}

メール本文を割り当てたり初期化したりして、後で同じプロパティ名で読み取る方法を教えてください。流暢なスタイルの開発の場合、プロパティは使用できないと思います。ここに光が必要です。

4

4 に答える 4

6

クラスの流暢なビルダーインターフェイスは、次のMailTemplateようになります。

public class MailTemplateBuilder
{
    string _body;
    string _subject;
    string _sender;

    public MailTemplateBuilder WithBody(string body)
    {
        _body = body;
        return this;
    }

    public MailTemplateBuilder WithSubject(string subject)
    {
        _subject = subject;
        return this;
    }

    public MailTemplateBuilder WithSender(string sender)
    {
        _sender = sender;
        return this;
    }

    public MailTemplate Build()
    {
        return new MailTemplate(_sender, _subject, _body);
    }
}

使用法は次のようになります。

var template = _builder.WithBody("body")
                       .WithSubject("subject")
                       .WithSender("sender")
                       .Build();

別のアプローチは、拡張メソッドを使用することです。

public static class MailTemplateBuilder
{
    public static MailTemplate WithBody(this MailTemplate item, string body)
    {
        item.MailBody = body;
        return item;
    }

    public static MailTemplate WithSubject(this MailTemplate item, string subject)
    {
        item.MailSubject = subject;
        return item;
    }

    public static MailTemplate WithSender(this MailTemplate item, string sender)
    {
        item.MailFrom = sender;
        return item;
    }
}

使用法は次のようになります。

var template = new MailTemplate().WithBody("body")
                                 .WithSubject("subject")
                                 .WithSender("sender");

注意:
どちらの場合も、MailTemplateクラスはこの流暢なインターフェースのコードで汚染されていません。単純なクラスになります。

public class MailTemplate
{
    public string MailBody { get; set; } = "";
    public string Subject { get; set; } = "";
    public string MailFrom { get; set; } = "";
}

したがって、提供されている流暢なインターフェイスのいずれかを使用してそのインスタンスを作成した後、プロパティにアクセスすることで値を読み取ることができます。

var body = template.MailBody;
于 2012-12-07T11:05:34.377 に答える
4

FluentNHibernate などの一部のフレームワークは、ラムダとして自分自身を渡すだけです。

MailTemplate
    .ConfigureWith(mt => mt.MailBody = "hello world")
    .ConfigureWith(mt => mt.MailFrom = "rdingwall@gmail.com")
    .DoSomeOtherStuff()
    .Build();

これの実装は次のようになります。

public class MailTemplate
{
    // regular auto properties
    public string MailFrom { get; set; }
    public string MailBody { get; set; }

    public MailTemplate ConfigureWith(Action<MailTemplate> func)
    {
        func(this);
        return this;
    }

    ...
}
于 2012-12-07T11:01:48.630 に答える
2

そのようなプロパティを使用して流暢なインターフェイスを作成することはできません。フィールドは型stringですが、プロパティはすべてMailTemplate.

プロパティの代わりに、これらを連鎖できるメソッドにします。

public class MailTemplate
{
    string _MailBody = "";

    public MailTemplate Body(string mailBody)
    {
        _MailBody = mailBody;
        return this;
    }

    ...
于 2012-12-07T11:03:15.273 に答える
2

@Richardが言ったように、FluentNHibernateは自分自身をラムダとして渡すだけです。c#を使用して同じことを行うこともできます。

public class MailTemplate
{
   
    public string To { get; set; }
    public string From { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
    public string Attachement { get; set; }

    public static MailTemplate Configure { get => new MailTemplate(); }


    public MailTemplate With(Action<MailTemplate> func)
    {
        func(this);
        return this;
    }

    internal void Build()
    {
        Console.WriteLine("Sending the mail....");
    }
}

これは、このメソッドを呼び出す方法です

MailTemplate
            .Configure
                .With(mt => mt.To = "michaelameyaw7@gmail.com")
                .With(mt => mt.From = "persol.system@gmail.com")
                .With(mt => mt.Subject = "Fluent Try Test")
                .With(mt => mt.Body = "Hello, this is mail body")
                .With(mt => mt.Attachement = "file.pdf")
           .Build();
于 2021-01-28T11:37:38.653 に答える