每次创建日志当调用接口类中的方法时

时间:2010-12-30 04:44:11

标签: asp.net logging

我想在每次调用接口类中的方法时更新日志文件(txt)? 除了在每个方法中编写代码以创建日志之外,还有什么方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:1)

这是我的30分钟。您必须在某处实现日志记录代码,因此您必须为代码创建另一个抽象。因此需要一个抽象类。我认为。这非常快速而且很脏。

public interface IService<T>
{
    List<T> GetAll();
    bool Add(T obj);
}

然后你需要抽象类来实现你的日志记录程序

public abstract class Service<T> : IService<T>
{
    private void log()
    {
        /// TODO : do log routine here
    }

    public bool Add(T obj)
    {
        try
        {
            log();
            return AddWithLogging(obj);
        }
        finally
        {
            log();
        }         
    }

    public List<T> GetAll()
    {
        try
        {
            log();
            return GetAllWithLog();
        }
        finally
        {
            log();
        }  
    }

    protected abstract List<T> GetAllWithLog();
    protected abstract bool AddWithLogging(T obj);
}

至于你的具体课程

public class EmployeeService : Service<Employee>
{
    protected override List<Employee> GetAllWithLog()
    {            
        return new List<Employee>() { new Employee() { Id = 0, Name = "test" } };
    }

    protected override bool AddWithLogging(Employee obj)
    {
        /// TODO : do add logic here
        return true;
    }
}

public class CompanyService : Service<Company>
{
    protected override List<Company> GetAllWithLog()
    {
        return new List<Company>() { new Company() { Id = 0, Name = "test" } };
    }

    protected override bool AddWithLogging(Company obj)
    {
        /// TODO : do add logic here
        return true;
    }
}

public class Employee
{
    public int Id {get;set;}
    public string Name { get; set;}
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后就你的实施而言,你可以......

    static void Main(string[] args)
    {
        IService<Employee> employee = new EmployeeService();
        List<Employee> employees = employee.GetAll();

        foreach (var item in employees)
        {
            Console.WriteLine(item.Name);
        }

        IService<Company> company = new CompanyService();
        List<Company> companies = company.GetAll();

        foreach (var item in companies)
        {
            Console.WriteLine(item.Name);
        }

        Console.ReadLine();
    }

希望这有帮助!

答案 1 :(得分:0)

我认为您必须使用面向方面编程来实现这一目标。阅读http://www.sharpcrafters.com/aop.net

答案 2 :(得分:0)

我认为你的意思是(而不是界面) 我能想到的两个选择:

实施 INotifyPropertyChanged ,这是在每个方法中编写代码的行

采用文章http://www.codeproject.com/KB/cs/AOP_Frameworks_Rating.aspx中的 AOP 框架,如果这不是一个重大飞跃