2012-04-13 10 views
0

私はそうのような文字列変数にビューの内容を読み取るしようとしています -ビジネスレイヤーアセンブリからビューのパスを取得するにはどうすればよいですか?

string _template = File.ReadAllText(@"Views/emails/registrationconfirmation.cshtml");

テンプレートから電子メールを作成するためにRazorEngineで使用することができるので、これがあります。

このコードはビジネスレイヤアセンブリです。私は、私が使用しようとしている仮想パスの代わりに物理パスが必要だと思う。

ファイルは、MVC3プロジェクトのViews/emailsフォルダにあります。ファイルを読むために必要な正しいパスをプログラムでどのように取得するのですか?

+0

ActionMailer.NETを評価しましたか?これは一見価値があり、NuGet経由でインストールすることができます。 https://bitbucket.org/swaj/actionmailer.net/wiki/Home –

+0

ありがとう、私はこれのスタンドアロンバージョンを調べるつもりです。また、私は興味深いRazorEngineを使用していることを実際に読んだ。リンクありがとう! –

答えて

1

ビジネスレイヤーはビューにパスを取得しようとしてはいけません。そのようなパスで作業する必要がある場合は、それらをUIレイヤから引数として渡す必要があります。代わりにこれを持っていることのあなたのビジネス層でそう

public class MyBusiness : IMyBusiness 
{ 
    public string RenderView() 
    { 
     string _template = File.ReadAllText(@"Views/emails/registrationconfirmation.cshtml"); 
     ... 
    } 
} 

あなたはこのかもしれない:

public class MyBusiness 
{ 
    public string RenderView(string viewPath) 
    { 
     string _template = File.ReadAllText(viewPath); 
     ... 
    } 
} 

をそれが今の世話をする、あなたのコントローラに位置し、呼び出し元のコードの責任です適切なパス(ASP.NETアプリケーションの場合はServer.MapPath関数を使用して取得でき、デスクトップアプリケーションの場合は相対パスなど)を渡します。このようにして、ビジネスレイヤはもはやASP.NETに強力に結合されなくなりました。

public class MyBusiness : IMyBusiness 
{ 
    private readonly string _basePath; 
    public MyBusiness(string basePath) 
    { 
     _basePath = basePath; 
    } 

    public string RenderView() 
    { 
     var file = Path.Combine(_basePath, @"Views\emails\registrationconfirmation.cshtml"); 
     string _template = File.ReadAllText(viewPath); 
     ... 
    } 
} 

、その後、残っているすべてのインスタンスを作成する際HostingEnvironment.ApplicationPhysicalPathプロパティ値を渡すためにあなたのDIフレームワークを設定することです:

もう一つの可能​​性は、ビジネス層は、コンストラクタの引数として、アプリケーションのベース物理パスを取ることですあなたのビジネス層。


UPDATE:@jgauffinはコメント欄で指摘したように、それもファイルに依存しないように、このコードは、さらにビジネス層にStreamまたはStreamReaderを渡すことによって改善することができます。これにより、再利用と単体テストの完全な分離がさらに容易になります。

+0

私はむしろ 'Stream'をビジネス層に渡したいと思います。 – jgauffin

+0

@jgauffin、ええ、 'ストリーム'、いいアイディア。このようにして、ビジネス層コードはファイルに依存することさえなく、単体で容易に単体テストできます。これを考慮に入れて投稿を更新します。 –

+0

@ダリン、これら両方のテクニックに感謝します。 1つの質問、もし私が 'Stream'を渡すのであれば、それは事実上参照を渡すだけでしょうか?ストリーム全体がコピーされますか?ありがとう、 –

0

Server.MapPathはあなたのケースで使用できますか?

+0

そうは思わない。 'Server'オブジェクトは、ビジネスレイヤーアセンブリで使用できないようです。私はそれがMVCアプリケーションアセンブリの外で動作するとは思わない。しかし、ありがとう。 –

関連する問題