2010-09-10 7 views
0

J'ai ces deux méthodesSubsonic Ajouter ou modifier la conversion des méthodes à la méthode générique

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); 
    } 
} 

et comme un exercice que je me demande si je pouvais utiliser une méthode générique mais juste changer la méthode de

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); 
     } 
    } 

ne fonctionne pas - le compilateur dit que le type T doit être un type de référence.

Alors, est-ce possible? Ou même souhaitable? Y a-t-il un meilleur refactoring?

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; } 
    } 

Répondre

0

Si l'ordinateur et l'utilisateur héritent d'une classe de base qui définit public Guid ObjectSid vous pouvez définir votre méthode générique comme

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); 
    } 
} 

et vous allez loin.

0

Nous avons fait cela en faisant toutes nos classes générées SubSonic implémenter une interface:

public interface IPersistable { 
    bool IsPersisted { get; } 
} 

La mise en œuvre des contrôles IsPersisted si le champ de clé primaire est égale à la valeur par défaut pour ce type. Nous conduisons alors une décision d'ajout ou de mise à jour sur Save off de cela. Cela nous évite d'interroger la base de données pour voir si l'identifiant existe là ou non.