2012-05-04 91 views
0

傳統智慧說不要從父母調用子女命名空間。何處放置由兒童名稱空間共享的類?

假設我正在使用類似AutoMapper的內容模型轉換爲ASP.NET MVC 3站點的視圖模型。

我的目錄結構類似於此:

- Stuff.Content 
    -Foo.cs 
- Stuff.Content.Public 
    -Controllers 
     -FooController.cs 
    -Models 
     -FooViewModel.cs 
    -Views 
     -Foo 
      -Index.cshtml 
- AutoMapperConfig.cs 
- Global.asax 

AutoMapperConfig.cs在這種情況下只是建立映射一個靜態方法簡單的靜態類,看起來像這樣:

public static class AutoMapperConfig 
{ 
    public static void Configure() 
    { 
     Mapper.CreateMap<Foo, FooViewModel>(); 
    } 
} 

你會發現我有AutoMapperConfig公共項目的根,但它實際上是調用到一個孩子的命名空間(Stuff.Content.Public.Models)。

是否調用該子名稱空間可接受?應該AutoMapperConfig住在模型命名空間與視圖模型?

好像它,因爲它被認爲是正常的控制器在控制器命名空間來調用它的兄弟機型命名在這片領土變得模糊。

期待您的想法。謝謝。

回答

1

我不認爲你目前的設計有什麼問題。我個人把映射配置爲Mappings子文件夾:

- Stuff.Content 
    -Foo.cs 
- Stuff.Content.Public 
    -Controllers 
     -FooController.cs 
    -Models 
     -FooViewModel.cs 
    -Views 
     -Foo 
      -Index.cshtml 
    -Mappings 
     -AutoMapperConfig.cs 
- Global.asax 

我也傾向於對每個域模型單獨的映射文件的定義。

-Mappings 
    -MappingRegistry.cs 
    -FooProfile.cs 
    -BarProfile.cs 
    -... 

而且這裏有FooProfile.cs一個例子:

public class FooProfile: Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Foo, FooViewModel>(); 
    } 
} 

MappingRegistry.cs

public static class MappingRegistry 
{ 
    public static void Configure() 
    { 
     Mapper.Initialize(
      x => typeof(MappingRegistry) 
       .Assembly 
       .GetTypes() 
       .Where(type => !type.IsAbstract && typeof(Profile).IsAssignableFrom(type)) 
       .ToList() 
       .ForEach(type => x.AddProfile((Profile)Activator.CreateInstance(type))) 
     ); 
    } 
} 
+0

這很酷,但如果我理解正確的話,你得對每種類型的單獨的配置文件被映射。與僅僅在一個類中的單個配置內部調用創建映射相比,使用該設置(以及使用反射)有什麼好處? –

相關問題