我定义了以下接口(interface):
public interface IAudit {
DateTime DateCreated { get; set; }
}
public interface IAuditable {
IAudit Audit { get; set; }
}
IAuditable
接口(interface)说明我将为哪些类提供Audit
。 IAudit
接口(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
}
但是我有很多问题: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;
}