Преобразование дозвуковых методов добавления или обновления в общий метод - PullRequest
0 голосов
/ 10 сентября 2010

Итак, у меня есть эти два метода

private static void AddOrUpdate(Computer input)
{
    if (Simple.Repository.Exists<Computer>(o => o.ObjectSid == input.ObjectSid))
    {
        Simple.Repository.Update(input);
    }
    else
    {
        Simple.Repository.Add(input);
    }
}

private static void AddOrUpdate(User input)
{
    if (Simple.Repository.Exists<User>(o => o.ObjectSid == input.ObjectSid))
    {
        Simple.Repository.Update(input);
    }
    else
    {
        Simple.Repository.Add(input);
    }
}

, и в качестве упражнения я задаюсь вопросом, могу ли я использовать универсальный метод, а просто изменить метод на

private static void AddOrUpdate<T>(T input)
    {
        if (Simple.Repository.Exists<T>(o => o.ObjectSid == input.ObjectSid))
        {
            Simple.Repository.Update(input);
        }
        else
        {
            Simple.Repository.Add(input);
        }
    }

не работает - компилятор говорит, что тип T должен быть ссылочным типом.

Так возможно ли это?Или даже желательно?Есть ли лучший рефакторинг?

    public class User
    {
        private string _samAccountName;

        [DisplayName("User Name")]
        public string SamAccountName 
        {
            get { return _samAccountName ?? "No User"; }
            set { _samAccountName = value; } 
        }

        public string UserPrincipalName { get; set; }
        public string DisplayName { get; set; }
        public DateTime LastLogonTimeStamp { get; set; }
        [SubSonicPrimaryKey] public Guid ObjectSid { get; set; }
        public Guid? ComputerGuid { get; set; }
    }

and

    public class Computer
    {
        public string DistinguishedName { get; set;}
        public string DnsHostname { get; set; }
        public string Description { get; set; }
        public string Cn { get; set; }
        public DateTime LastLogonTimeStamp { get; set; }
        public String OperatingSystem { get; set; }
        public string OperatingSystemServicePack { get; set; }
        [SubSonicPrimaryKey] public Guid ObjectSid { get; set;}
        public Guid? UserGuid { get; set; }
    }

Ответы [ 2 ]

0 голосов
/ 16 ноября 2010

Мы сделали это, заставив все наши сгенерированные SubSonic классы реализовать интерфейс:

public interface IPersistable {
  bool IsPersisted { get; }
}

Реализация IsPersisted проверяет, равно ли поле первичного ключа значению по умолчанию для этого типа. Затем мы вынуждаем решение о добавлении или обновлении для сохранения от этого. Это позволяет нам избегать запросов к БД, чтобы узнать, существует ли там идентификатор.

0 голосов
/ 16 ноября 2010

Если компьютер и пользователь наследуют от базового класса, который определяет public Guid ObjectSid, тогда вы можете определить свой универсальный метод как

private static void AddOrUpdate<T>(T input) where T : BaseClass, new()
{
    if (Simple.Repository.Exists<T>(o => o.ObjectSid == input.ObjectSid))
    {
        Simple.Repository.Update(input);
    }
    else
    {
        Simple.Repository.Add(input);
    }
}

и все, что вам нужно.

...