0

ビューの内容を次のように文字列変数に読み込もうとしています-

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

これは、テンプレートから電子メールを作成するためにRazorEngineで使用できるようにするためです。

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

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

4

2 に答える 2

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 に強く結合されなくなります。

もう 1 つの可能性は、ビジネス レイヤーがアプリケーションの基本物理パスをコンストラクター引数として取得することです。

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 フレームワークを構成するだけです。


更新: @jgauffin がコメント セクションで指摘したように、このコードは、ファイルに依存しないようにaStreamまたは aをビジネス レイヤーに渡すことでさらに改善できます。StreamReaderこれにより、完全に分離した状態での再利用と単体テストがさらに容易になります。

于 2012-04-13T06:19:12.713 に答える
0

Server.MapPathはあなたのケースで機能しますか?

于 2012-04-13T04:37:32.023 に答える