代码之家  ›  专栏  ›  技术社区  ›  Chaddeus

我是不是从一个糟糕的实践路径开始,为活动日志创建单独的类?

  •  4
  • Chaddeus  · 技术社区  · 14 年前

    我有一个web应用程序,其中包含用户所采取的操作的活动日志。可以记录多种类型的活动。

    public static class NewAccountActivity() {
      public static Write(string username) {
        //... do stuff to enter a new account activity into the database ...
      }
    }
    public static class NewPostActivity() {
      public static Write(string username, long postId, string postTitle) {
        //... do stuff to enter a new post activity entry into the database ...
      }
    }
    

    然后继续为要记录的每种类型的活动创建一个新类。每个活动都有一个.Write()方法,每个方法都有一个唯一的签名(如上面的代码示例所示)

    然后在我的web应用程序(基于asp.net mvc)中,我这样使用它们:

    public ActionResult NewAccount(Account account) {
      if (Model.IsValid(account)) {
        //... do new account stuff ...
    
        NewAccountActivity.Write(account.UserName);
    
        //... redirect to action, or show view ...
      }
    }
    
    public ActionResult NewPost(Post post) {
      if (Model.IsValid(post)) {
        //... do new post stuff ...
    
        NewPostActivity.Write(post.UserName, post.postId, post.Title);
    
        //... redirect to action, or show view ...
      }
    }
    

    我开始这样做是因为 an answer to a different question I had on SO .

    2 回复  |  直到 8 年前
        1
  •  4
  •   Pierre-Alain Vigeant    14 年前

    这是我的建议。

    DI container .

    为活动创建一个接口,即 IActivity Write Log 方法。对于处理大于一行代码的每个活动,创建一个实现 活动性

    现在,对于所有其他简单的活动日志,创建一个接受 function lambda

    例如,在这段代码中,我假设每个活动构建一个字符串并通过 日志

    public class NewAccountActivity : IActivity
    {
        private string userName;
    
        public NewAccountActivity(string userName)
        {
            this.userName = userName;
        }
    
        public string Log()
        {
            return this.UserName;
        }
    }
    
    public class ActivityEntry : IActivity
    {
        private Func<string> action;
    
        public ActivityEntry(Func<string> action)
        {
            this.action = action;
        }
    
        public string Log()
        {
            return this.action();
        }
    }
    

    现在在静态记录器类中,创建两个函数:

    public static class Logger
    {
        public static void Write(IActivity activity)
        {
            // Ask activity for its data and write it down to a log file
            WriteToFile(activity.Log());
        }
    
        public static void Write(Func<string> action)
        {
            Write(new ActivityEntry(action));
        }
    }
    

    Logger.Write(new NewAccountActivity(currentUserName));
    

    或者如果您需要记录其他简单的内容:

    Logger.Write(() => "Hello world");
    

        2
  •  2
  •   Ed Swangren    14 年前