我定义了以下接口(interface):

public interface IAudit {
    DateTime DateCreated { get; set; }
}

public interface IAuditable {
    IAudit Audit { get; set; }
}
IAuditable接口(interface)说明我将为哪些类提供AuditIAudit接口(interface)是该类的实际Audit。例如说我有以下实现:
public class User : IAuditable {
    public string UserName { get; set; }
    public UserAudit Audit { get; set; }
}

public class UserAudit : IAudit {
    public string UserName { get; set; }
    public DateTime DateCreated { get; set; }

    public UserAdit(User user) {
        UserName = user.UserName;
    }
}
现在给定一个对象IAuditable(上面的User),我希望能够通过将IAudit对象输入构造函数来创建一个UserAdit(上面的IAuditable)实例。理想情况下,我会喜欢:
if (myObject is IAuditable) {
    var audit = new IAudit(myObject) { DateCreated = DateTime.UtcNow }; // This would create a UserAudit using the above example
}
但是我有很多问题:
  • 您无法创建接口(interface)
  • 的实例
  • 没有在代码中的哪个位置定义哪个IAudit应用于哪个IAuditable
  • 我无法指定IAudit接口(interface)必须具有采用IAuditable的构造函数

  • 我确定这是许多人以前设计过的设计模式,但我无法理解。如果有人能告诉我如何实现这一目标,我将非常感激。

    最佳答案



    您可以通过在CreateAudit()中添加IAuditable函数来修复这两个问题。然后,您将获得从IAudit创建的IAuditable。另外,如果您想在IAudit中存储对IAuditable的引用(反之亦然),以便可以将它们相互关联,那么可以很容易地实现一个实现类。例如,您还可以在GetAuditable()中添加IAudit,以获取其创建时的IAuditable

    简单的实现如下所示(在实现IAuditable的类上):

    public IAudit CreateAudit()
    {
        UserAudit u = new UserAudit(UserName);
        return u;
    }
    

    07-24 09:55