Поскольку у меня есть сервисный уровень, посредник между моими контроллерами (im using ASP.NET MVC) и мой репозиторий, я решил автоматически установить поля здесь.
Кроме того, у моих POCO нет отношений / абстракций, они полностью независимы. Я хотел бы сохранить его таким образом, а не отмечать какие-либо виртуальные свойства или создавать базовые классы.
Итак, я создал интерфейс IAutoGenerateDateFields:
public interface IAutoGenerateDateFields
{
DateTime LastModified { get;set; }
DateTime CreatedOn { get;set; }
}
Для любого POCO i хотите автоматически сгенерировать эти поля, я реализую эту интуицию.
Используя пример в моем вопросе:
public class PocoWithDates : IAutoGenerateDateFields
{
public string PocoName { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime LastModified { get; set; }
}
На моем сервисном уровне я теперь проверяю, реализует ли конкретный объект интерфейс:
public void Add(SomePoco poco)
{
var autoDateFieldsPoco = poco as IAutoGenerateDateFields; // returns null if it's not.
if (autoDateFieldsPoco != null) // if it implements interface
{
autoDateFieldsPoco.LastModified = DateTime.Now;
autoDateFieldsPoco.CreatedOn = DateTime.Now;
}
// ..go on about other persistence work.
}
Я, скорее всего, сломаю этот код в дополнении к методу помощника / расширения позже.
Но я думаю, что это достойное решение для моего сценария , так как я не хочу использовать виртуальные машины в Save (поскольку я использую Unit of Work, Repository и Pure POCO) и не хочу использовать триггеры.
Если у вас есть мысли / предложения, дайте мне знать.