0

私がやろうとしていること

T4 を使用してメール メッセージ テンプレートを作成しようとしています。

私は前処理されたテンプレートMicrosoft.VisualStudio.TextTemplatingを使用しています。これは、アセンブリへの依存関係を導入せずに実行時にメッセージを生成したい場合に、正しく理解している場合に必要なことです。

テンプレートにデータを渡したいので、パラメータを追加しました。

<#@ template language="C#" #>
<#@ parameter name="Param1" type="System.String" #>
<#@ parameter name="Param2" type="System.    
Lorem <#= Param1 #> dolor <#= Param2 #>

次に、次のような引数を渡すメッセージを生成できます。

static void Main(string[] args) {
    var template = new LoremIpsum();
    template.Session = new Dictionary<string, object>() { 
        {"Param1", "ipsum"},
        {"Param2", "sit amet"},
    };
    template.Initialize();
    string text = template.TransformText();
}

何が問題ですか

これらのクラスをいくつか生成する必要があるため、すべてのクラスに、次のようなメールを送信するための共通のメソッドを持たせたいと考えています。

public void SendMail(string to, IDictionary<string, object> parameters)

または、さらに良い:

public void SendMail(string to, string Param1, string Param2)

生成されたクラスは部分的であるため、別の部分クラス宣言を追加してメソッドを追加することは可能ですが、これは、生成されたすべてのクラスに対して (多かれ少なかれ) 同じコードを繰り返さなければならないことを意味します。

これまでに試したこと

基本クラスを作成しようとしましたが、これを実行しようとすると:

<#@ template language="C#" inherits="MailTemplateBase" #>

次に、生成されたクラスがいくつかのヘルパー メソッドを定義した基本クラスに依存していたため、生成されたコードが壊れLoremIpsumBaseます (そして、生成された各クラスがほぼ同一であるが異なる基本クラスから継承されても意味がありません)。

質問

  1. テンプレートの基本クラスを作成するにはどうすればよいですか?
  2. テンプレートで宣言されているものと同じパラメーターを受け入れるメソッドを生成するにはどうすればよいですか?
4

2 に答える 2

2

空のテンプレートを作成し、作成したクラスをコピーして基本クラスとして使用する必要があると思います。その後、必要なプロパティで拡張できます。(コードをコピーしたら、空のテンプレートを保持する必要はありません)

あなたがやろうとしていることは、VS 2010 RTM ですぐに使えると思いますが、VS2010 SP1 では、テンプレート自体をサブクラス化できるように動作が変更されました。詳細については、この接続の問題を確認してください。

編集:

ベースに電子メールのメソッドを配置する限り、私はおそらくそのようにはしません。必要なさまざまなメソッドを備えたある種のテンプレート サービスを公開することを検討することをお勧めします。たとえば、次のようになります。

public class TemplatingService : ITemplatingService
{
    public string GenerateReminderMessage(string to, string name)
    {
        // Construct the template, passing in the parameters into the session as required
        ...
        // Return the results of the template transformation
    }
}

そうすれば、実際の T4 実装から離れて抽象化されるため、何かが行のどこかで壊れた場合でも、1 つのクラスで修正するだけで済みます。

そして、テンプレート サービスを使用してメール コンテンツを生成するメール サービスを公開します。

public class MailService : IMailService
{
    public void SendReminderEmail(string to, string name)
    {
        var message = this.TemplatingService.GenerateReminderMessage(to, name);
        this.MailerService.SendEmail(to, message);
    }
}

MailerService は .NET メール コードの単純なラッパーにすぎませんが、MailService を分離して単体テストできることに注意してください。

抽象化する方法は他にもあると思いますが、それが出発点です。

それが役立つことを願っています。

于 2012-05-24T16:58:47.920 に答える
0

コンストラクター注入がデータをクラスに注入する唯一の方法であると仮定しているように思えます。ただし、このシナリオでは、メソッド/プロパティの注入がより良いオプションであると思います。

手元にコンパイラがなく、確実に検証することはできませんが、動作する可能性があります。

于 2012-05-24T15:40:27.787 に答える