【问题标题】:How to add a class to record activity?如何添加一个类来记录活动?
【发布时间】:2020-03-02 13:50:25
【问题描述】:

我有一个类库为系统的不同区域执行一些 CRUD 操作。我的一个常见要求是记录活动。我的项目是结构化的,所以我有一个接口,一个类使用该接口。

public interface Users
{
 void AddUser(User u);
}

public interface Products
{
 void AddProducts(Product p);
}

Likewise my class code is similar to 

public class Users : DataContext, IUsers
{
 void AddUser(User u)
 {
   Context.User.InsertOnSubmit(u);
   Context.SubmitChanges();
   // AddActivity("User was added");
 }
}

public class Products : DataContext, IProducts
{
 void AddProducts(Product p)
 {
   Context.Products.InsertOnSubmit(p);
   Context.SubmitChanges();
 // AddActivity("Product was added");
 }
}

这很好用,但我需要添加所有发生的活动,即当用户添加产品或用户时。

考虑到这将在上述其他类似的类中重复使用,我想尽量减少重复/复制代码。我确实考虑过使用abstract 类,但收到一个对象没有实例化错误,所以不确定我的方法是错误还是遗漏了什么。我不想让我的类继承 UserActivity 接口,因为这意味着我需要将代码复制到该特定类中才能工作。这一类将执行相同类型的任务(只需添加一条记录)。

我怎样才能在我的项目中添加另一个类来完成一项记录活动的任务,但如果我需要对活动插入方法进行更改,我可以在一个地方执行此操作,而不是遍历所有类?

【问题讨论】:

  • 研究使用 AoP-> Unity.Interception.Interceptors ?
  • 你指的是这个koukia.ca/…吗?如果是这样,我正在使用 DBML 文件来访问数据,所以不确定这是否有帮助?
  • 当然,或者这个github.com/siccolo/IoC-Using-MSUnity。在你的“拦截器”中,你有 IMethodInvocation->MethodBase 或 IMethodInvocation->Target,你可以使用它来收集关于哪个方法被拦截的更多信息。
  • 对不起,我迷路了。我想做的就是有一种更好、更简洁的方法来跨多个类添加 ActivityLogs,而无需太多维护。我不确定链接会涉及什么?有什么我可以效仿的例子吗?

标签: c# asp.net .net vb.net generics


【解决方案1】:

@Computer,-评论太长了,所以我将作为“答案”发布,

使用 Unity.UnityContainer,您可以“附加”活动记录器 -

    container.RegisterType<IProducts, Products>(
            new Interceptor<InterfaceInterceptor>()
            , new InterceptionBehavior<LoggingAspect>());, 

    ....
    public class LoggingAspect : IInterceptionBehavior, ILogger
    {
        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
                //  log activity
                WriteLog($"{DateTime.Now.ToString("HH:mm:ss")} --> {input.MethodBase.Name}");
                // Invoke the next behavior in the chain. 
                var result = getNext()(input, getNext);
                return result;
        }
    }

【讨论】:

  • @Computer,-那么你是如何实现你的活动记录器的?
【解决方案2】:

创建一个继承自 DataContext 的类。 将用户和产品中的基类替换为您创建的类。

public class User 
{

}

public class Product 
{

}

public class Actions : DataContext
{
    public void AddMessage(string Msg)
    {
        MessageAction += Msg;
    }

    public string MessageAction { get; private set; }


}

public interface IUsers 
{
    void AddUser(User u);
}

public interface IProducts 
{
    void AddProducts(Product p);
}

public class Users : Actions, IUsers
{

    public void AddUser(User u)
    {
        Context.User.InsertOnSubmit(u);
        Context.SubmitChanges();
        base.AddMessage("Add User");
    }
}

public class Products : Actions, IProducts
{

    public void AddProducts(Product p)
    {
        Context.Products.InsertOnSubmit(p);
        Context.SubmitChanges();
        base.AddMessage("Add Products");

    }
}

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多