1

私はそのプロパティを持つモデルAdministratorを持っていますが、それはまた、たとえばGetByCredentials(string username, string password);. 静的メソッドを別の場所に分割し、オブジェクトをできるだけ純粋にすることは何とか可能ですか?

public class Administrator : Entity
{
    // OBJECT START
    public int Id { get; set; }
    public DateTime CreatedDateTime { get; set; }
    public DateTime UpdatedDateTime { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string PasswordSalt { get; set; }

    public void SetNewPassword(string password)
    {
        var cryptoService = new PBKDF2();
        this.Password = cryptoService.Compute(password);
        this.PasswordSalt = cryptoService.Salt;
    }

    public override void OnBeforeInsert()
    {
        this.CreatedDateTime = DateTime.Now;
        this.UpdatedDateTime = DateTime.Now;

        this.SetNewPassword(this.Password);
    }

    public override void OnBeforeUpdate()
    {
        this.UpdatedDateTime = DateTime.Now;
    }
    // OBJECT END

    // Now I have multiple static methods that do not really
    // have anything to do with current object
    public static Administrator GetByCredentials(string username, string password)
    {
        var db = new MainDataContext();
        var admin = db.Administrators.SingleOrDefault(x => x.Username == username);
        if (admin == null) return null;

        ICryptoService cryptoService = new PBKDF2();
        var hash = cryptoService.Compute(password, admin.PasswordSalt);

        if (hash == admin.Password) return admin;
        return null;
    }

    public static bool IsCurrentIpBanned
    {
        get
        {
            const int minutesBlocked = 5;
            const int maxLoginCount = 5;

            var db = new MainDataContext();
            var loginCount = db.AdministratorAuthorizationLogs.AsEnumerable().Count(x => x.Ip == HttpContext.Current.Request.UserHostAddress && x.CreatedDateTime.AddMinutes(minutesBlocked) > DateTime.Now && x.IsSuccess == false);

            return loginCount > maxLoginCount;
        }
    }

    public static void LogSuccess(Administrator admin)
    {
        Administrator.Log(admin, true);
    }

    public static void LogFailure(Administrator admin)
    {
        Administrator.Log(admin, false);
    }

    private static void Log(Administrator admin, bool success)
    {
        var db = new MainDataContext();
        db.AdministratorAuthorizationLogs.Add(new AdministratorAuthorizationLog
        {
            Username = admin.Username,
            Password = admin.Password,
            Ip = HttpContext.Current.Request.UserHostAddress,
            IsSuccess = success
        });

        db.SaveChanges();
    } 
}
4

2 に答える 2

1

ここにはいくつかのオプションがありますが、主なことは、C# クラスが関心を分離するためのツールであるということです。

最も明白なのは、それらのものを独自の抽象化でキャプチャすることです。たとえばGetByCredentials、別のクラスなどの (非静的) メンバーの方が適している場合がありますAuthorityAdministratorそのクラスは型を作成できる必要があるだけです。

拡張メソッドを使用することもできます。その候補として考えられるのはLog、引数として を取り、そのAdministrator上で公共施設のみを使用する です。拡張メソッドは別のクラスで定義されますが、拡張クラスのメンバーであるかのように使用できます。例:

public static class AdministratorExtensions
{
    public static void log( this Administrator admin, bool success ) { ... }
}

var admin = new Administrator();
admin.Log( true );

重要なことは、実際の抽象化を特定し、それらを適切な方法で組み合わせてシステムを構築することです。懸念事項を分離することは、そのプロセスの一部です。

于 2013-08-01T15:03:37.943 に答える
0

これは、クラスが「知りすぎている」というヒントです。管理者クラスは、管理者に関係することだけを知っている必要があります。データベースにクエリを実行してエンティティを取得することはできません。

リポジトリ パターンを調べる必要があります。アプリケーションを複数のレイヤーに分解してみてください。たとえば、データベース エンティティのクエリと更新を主な目的とする DataRepository クラスを作成できます。

于 2016-09-05T18:07:50.893 に答える