将子命名空间共享的类放在何处?

时间:2012-05-04 00:33:06

标签: asp.net-mvc-3 automapper

传统观念认为不要从父母那里调用子命名空间。

假设我使用 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 )。

调用那个子命名空间是否可以接受? 模型名称空间中是否应该使用viewmodels存在 AutoMapperConfig

似乎它在这个领域变得模糊,因为控制器命名空间中的控制器调用其兄弟模型命名空间被认为是正常的。

期待您的想法。感谢。

1 个答案:

答案 0 :(得分: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)))
        );
    }
}