2010-04-10 83 views
3

在使用Linq to Sql时,我创建了一个将数据传送到网页的独立类。为了简化创建这些渡口对象,我使用专门的构造函数或显式转换运算符。我有两个问题。构造函数或显式类型转换

首先从可读性的角度来看哪种方法更好?

二而产生的CLR代码看起来是一样的我,是其中一个会被编译器处理比其他的不同(拉姆达的或如)存在的情况。

示例代码(DatabaseFoo使用专门的构造和BusinessFoo使用显式运算符):

public class DatabaseFoo 
{ 
    private static int idCounter; // just to help with generating data 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public DatabaseFoo() 
    { 
     Id = idCounter++; 
     Name = string.Format("Test{0}", Id); 
    } 
    public DatabaseFoo(BusinessFoo foo) 
    { 
     this.Id = foo.Id; 
     this.Name = foo.Name; 
    } 
} 

public class BusinessFoo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public static explicit operator BusinessFoo(DatabaseFoo foo) 
    { 
     return FromDatabaseFoo(foo); 
    } 


    public static BusinessFoo FromDatabaseFoo(DatabaseFoo foo) 
    { 
     return new BusinessFoo {Id = foo.Id, Name = foo.Name}; 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Creating the initial list of DatabaseFoo"); 
     IEnumerable<DatabaseFoo> dafoos = new List<DatabaseFoo>() { new DatabaseFoo(), new DatabaseFoo(), new DatabaseFoo(), new DatabaseFoo(), new DatabaseFoo(), new DatabaseFoo()}; 

     foreach(DatabaseFoo dafoo in dafoos) 
      Console.WriteLine(string.Format("{0}\t{1}", dafoo.Id, dafoo.Name)); 

     Console.WriteLine("Casting the list of DatabaseFoo to a list of BusinessFoo"); 
     IEnumerable<BusinessFoo> bufoos = from x in dafoos 
              select (BusinessFoo) x; 

     foreach (BusinessFoo bufoo in bufoos) 
      Console.WriteLine(string.Format("{0}\t{1}", bufoo.Id, bufoo.Name)); 

     Console.WriteLine("Creating a new list of DatabaseFoo by calling the constructor taking BusinessFoo"); 
     IEnumerable<DatabaseFoo> fufoos = from x in bufoos 
             select new DatabaseFoo(x); 

     foreach(DatabaseFoo fufoo in fufoos) 
      Console.WriteLine(string.Format("{0}\t{1}", fufoo.Id, fufoo.Name)); 
    } 
} 

回答

5

我不是转换大部分的忠实粉丝 - 不论是明确的或隐含的。相同的语法:(TypeName) expression用于各种不同类型的转换,并且知道编译器应用的是哪种类型会有点混乱。

FromDatabaseFoo这样的静态工厂方法很好 - 您可能还希望在DatabaseFoo上有一个实例方法ToBusinessFoo。在我看来,这两个都比用户定义的转换更清晰。

(这并不是说,自定义的转换是总是一个坏主意,你要知道,我只是在一般的警惕他们。)

+0

我可能会在DatabaseFoo类中使用静态ToBusinessFoo和静态FromBusinessFoo,并避免将任何内容放入BusinessFoo中,因为重点在于尽量减少BusinessFoo对数据的了解。 转换也不适合我。所以你更喜欢静态方法来使用一个构造函数:DatabaseFoo(businessFoo)? – Felan 2010-04-10 19:42:41

+2

@Felan:你可以在DatabaseFoo上将它设置为一个*扩展*方法......这样DatabaseFoo本身不知道它,但它看起来像它。说实话,构造函数或静态方法不会让我感到困扰。静态方法有一些优点,比如能够缓存或返回null,并且有名称来消除参数的歧义。建设者更典型。 – 2010-04-10 21:27:08

2

我会建议你在看AutoMapper。它将使你的代码更加清晰,并将这些对象之间的映射分开,使它们独立并且更加可重用。

+2

感谢这很有趣的联系,我一定会打使用AutoMapper。 有很多情况下,这样会很方便。有时候添加像AutoMapper这样的抽象看起来好像走了一段路,避免穿越繁忙的街道。如果你只需穿越一条繁忙的街道,那么额外的一英里似乎并不值得,但如果你必须越过几条恶劣的街道,那么更长的时间(这将变得更短)和更清洁的路径得到回报。 – Felan 2010-04-10 19:31:50

相关问题