Asp.net mvc 使用Autofac注入接口的特定实例

Asp.net mvc 使用Autofac注入接口的特定实例,asp.net-mvc,dependency-injection,asp.net-mvc-3,automapper,autofac,Asp.net Mvc,Dependency Injection,Asp.net Mvc 3,Automapper,Autofac,我正在使用ASP.NET MVC 3和Autofac进行依赖注入。我正在使用AutoMapper进行映射 我有一个IMapper类,用于所有模型视图映射。所以我的任何映射类都可以实现这个接口。在下面的控制器中,构造函数接收一个IMapper实例,在我的用户控制器中,它可能接收另一个实例,可能是userMapper。回到下面的代码,我有一个名为NewsMapper的类,它实现了IMapper。如何设置依赖项注入,以便此控制器必须接收NewsMapper的实例?请记住,我可能有另一个名为UserMa

我正在使用ASP.NET MVC 3和Autofac进行依赖注入。我正在使用AutoMapper进行映射

我有一个IMapper类,用于所有模型视图映射。所以我的任何映射类都可以实现这个接口。在下面的控制器中,构造函数接收一个IMapper实例,在我的用户控制器中,它可能接收另一个实例,可能是userMapper。回到下面的代码,我有一个名为NewsMapper的类,它实现了IMapper。如何设置依赖项注入,以便此控制器必须接收NewsMapper的实例?请记住,我可能有另一个名为UserMapper的映射程序

我有以下控制器:

public class NewsController
{
   private INewsService newsService;
   private IMapper newsMapper;

   public NewsController(INewsService newsService, IMapper newsMapper)
   {
      if (newsService == null)
      {
         throw new ArgumentNullException("newsService");
      }

      if (newsMapper == null)
      {
         throw new ArgumentNullException("newsMapper");
      }

      this.newsService = newsService;
      this.newsMapper = newsMapper;
   }
}
我的global.asax.cs中有以下配置:

var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<NewsService>().As<INewsService>();
builder.RegisterType<NewsRepository>().As<INewsRepository>();
我的新闻映射器类:

public class NewsMapper : IMapper
{
   static NewsMapper()
   {
      Mapper.CreateMap<News, NewsViewModel>();
      Mapper.CreateMap<NewsViewModel, News>();
   }

   public object Map(object source, Type sourceType, Type destinationType)
   {
      return Mapper.Map(source, sourceType, destinationType);
   }
}

这里的问题是
IMapper
合同的广泛性。它太笼统了,
NewsController
想要将
News
之类的东西映射到
NewsViewModel
,但是
IMapper
只是说“将某物映射到某物”

相反,请看看如何创建一个通用变量,例如
IMapper
。然后,您可以设置容器,以便
新闻控制器
接收一个明确的
IMapper
,它应该唯一地匹配
新闻映射器
组件(但是您决定进行设置)

编辑

有关通用映射器主题的示例/变体,请参见:


    • 这里的问题是
      IMapper
      合同的广泛性。它太笼统了,
      NewsController
      想要将
      News
      之类的东西映射到
      NewsViewModel
      ,但是
      IMapper
      只是说“将某物映射到某物”

      相反,请看看如何创建一个通用变量,例如
      IMapper
      。然后,您可以设置容器,以便
      新闻控制器
      接收一个明确的
      IMapper
      ,它应该唯一地匹配
      新闻映射器
      组件(但是您决定进行设置)

      编辑

      有关通用映射器主题的示例/变体,请参见:


      您在MVC系统中注册了生成器吗?@BuildStarted:是的,所有设置都正确,我没有包括所有代码,只是其中的一部分。您在MVC系统中注册了生成器吗?@BuildStarted:是的,所有设置都正确,我没有包括所有代码,只是其中的一部分。@Nick:我不理解您100%的答案。我已经更新了我的原始帖子,向您展示了我是如何实现映射的。如何更改它以符合您的解释?你介意在你的答案中加入示例代码吗?还有一个问题,映射应该包含在控制器中还是服务层中?@Brendan我通常对AutoMapper在这种情况下的使用持怀疑态度-如果您不得不维护域模型的可序列化表示,那么它很有用,但在这种情况下,我会让控制器负责管理其视图模型(可能只是在可能的情况下将域对象聚合到视图模型中。)@Nick:我不完全理解你的答案。我已经更新了我的原始帖子,向您展示了我是如何实现映射的。如何更改它以符合您的解释?你介意在你的答案中加入示例代码吗?还有一个问题,映射应该包含在控制器中还是服务层中?@Brendan我通常对AutoMapper在这种情况下的使用持怀疑态度-如果您不得不维护域模型的可序列化表示,那么它很有用,但在这种情况下,我会让控制器负责管理其视图模型(并且可能只是在可能的情况下将域对象聚合到视图模型中)
      public class NewsMapper : IMapper
      {
         static NewsMapper()
         {
            Mapper.CreateMap<News, NewsViewModel>();
            Mapper.CreateMap<NewsViewModel, News>();
         }
      
         public object Map(object source, Type sourceType, Type destinationType)
         {
            return Mapper.Map(source, sourceType, destinationType);
         }
      }
      
      [HttpPost]
      public ActionResult Create(NewsViewModel newsViewModel)
      {
         // Check model state
         if (!ModelState.IsValid)
         {
            return View("Create", newsViewModel);
         }
      
         // Do mapping
         var news = (News)newsMapper.Map(newsViewModel, typeof(NewsViewModel), typeof(News));
      
         // Add to database via news service
      
         // Redirect to list view
         return RedirectToAction("List", "News");
      }