-2

最近、静的変数がどれほど安全でないかについての質問について投稿しましたが、それ以来、それらを取り除く必要があることに気づきました。しかし、私はその方法を理解できませんか?単一のインスタンスを返す各クラスの静的なGet()メソッドを考えていましたが、その場合、そのインスタンスは静的に宣言する必要があります。

したがって、それを行う唯一の方法は、インスタンス参照(各ヘルパー、IEユーザーhelper.cs、imagehelper.csなど)を、グローバルにアクセス可能なクラスのインスタンスプロパティとして宣言することです。しかし、どのクラスですか?ここに欠けているものはありますか?

変更する必要があるサンプルクラスの以下のコード:

sing System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Mvc.Mailer;

namespace MVCWebsite.Helpers
{
        public class AppSettings
        {
                public static void OnAppInit()
                {
                        //General
                        AppName = "MyApp";
                        DesktopBaseURLs = new Dictionary<string, string>();
                        DesktopBaseURLs.Add("dev", "localhost:50560");
                        DesktopBaseURLs.Add("test", "www.test.whatever.com");
                        DesktopBaseURLs.Add("live", "www.whatever.com");
                        MobileBaseURLs = new Dictionary<string, string>();
                        MobileBaseURLs.Add("dev", "m.local.whatever.com");
                        MobileBaseURLs.Add("test", "m.test.whatever.com");
                        MobileBaseURLs.Add("live", "m.whatever.com");

                        //Emails
                        EmailHostName = AppName + ".com"; //For the moment atleast
                        NoReplyEmailAddress = "no-reply@" + EmailHostName.ToLower();
                        SupportEmailAddress = "support@" + EmailHostName.ToLower();
                        ErrorEmailAddress = "errors@" + EmailHostName.ToLower();

                        //Resources
                        TempFileURL = "/content/temp/";
                        UserDataURL = "/content/user-content/";
                        ProfilePicturesURL = UserDataURL + "profile-pictures/";

                        var a = GlobalHelper.GetURLAsServerPath(ProfilePicturesURL);
                        var b = a;

                }

                //General
                public static string AppName { get; set; }
                public static Dictionary<string, string> DesktopBaseURLs;
                public static Dictionary<string, string> MobileBaseURLs;

                //Emails
                public static string EmailHostName { get; set; }
                public static string NoReplyEmailAddress { get; set; }
                public static string SupportEmailAddress { get; set; }
                public static string ErrorEmailAddress { get; set; }

                //Resources
                public static string UserDataURL { get; set; }
                public static string TempFileURL { get; set; }
                public static string ProfilePicturesURL { get; set; }

                //Methods
                public static void SetAppURL()
                {

                }
        }
}
4

3 に答える 3

2

AppSettings クラスのインターフェイスを作成することをお勧めします。これにより、コントローラーで今すぐ使用でき、適切と思われるさまざまな方法で実装できます。

public interface IAppSettings
{
    string AppName { get; set; }
    ...
}

その後、ラッパー クラスを介して静的クラスですぐに実装できます。

public class AppSettingsWrapper : IAppSettings
{
    public AppName
    {
        get
        {
            return AppSettings.AppName;
        }
        set
        {
            AppSettings.AppName = value;
        }
    }

    ...
}

後で、セッション、Cookie、データベース値などを使用する IAppSettings の実装を作成できます。重要なことは、ニーズを満たす方法で実装できるように、物事を格納する方法を抽象化することです。

于 2013-01-09T23:14:54.943 に答える
1

前の質問への回答では、IDictionary はスレッドセーフではないため、静的メソッドで唯一の安全でない変数であることが明確に述べられていました。これらの変数を別の方法で保存する必要があるだけです。すべての静的変数を取り除く必要はありません。IDictionary をスレッドセーフなものに変更するだけです。

ところで、誰かが web.config について良いコメントをしています。

于 2013-01-09T23:10:24.000 に答える
-1

私はそれを理解したと思います.Global.asax.cs内にインスタンス変数として保存する必要があります. このファイルには、System.Web.HttpApplication から継承する Application クラスが含まれています。このマスター クラスは、リクエストごとに (それ自体の) 1 つのインスタンスに制限されます。したがって、ヘルパーへの参照をここに保存すると、MvcApplication.MyHelper.DoSomething(); に移動して参照できます。これが間違っている場合は、誰かが私を修正してください。「任意の時点で、HTTPApplication インスタンスは 1 つのリクエストのみを処理するため、非静的メンバーのロックとロック解除について考える必要はありませんが、静的メンバーについては必要です。」 -from : http:// www.codeproject.com/Articles/87316/A-walkthrough-to-Application-State#c

于 2013-01-10T03:54:25.297 に答える