Asp.net mvc 使用Autofac注入接口的特定实例
我正在使用ASP.NET MVC 3和Autofac进行依赖注入。我正在使用AutoMapper进行映射 我有一个IMapper类,用于所有模型视图映射。所以我的任何映射类都可以实现这个接口。在下面的控制器中,构造函数接收一个IMapper实例,在我的用户控制器中,它可能接收另一个实例,可能是userMapper。回到下面的代码,我有一个名为NewsMapper的类,它实现了IMapper。如何设置依赖项注入,以便此控制器必须接收NewsMapper的实例?请记住,我可能有另一个名为UserMapper的映射程序 我有以下控制器: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
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
,它应该唯一地匹配新闻映射器
组件(但是您决定进行设置)
编辑
有关通用映射器主题的示例/变体,请参见:
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");
}