Bre*_*ogt 0 asp.net-mvc dependency-injection autofac automapper asp.net-mvc-3
我使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的global.asax.cs中有以下配置:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<NewsService>().As<INewsService>();
builder.RegisterType<NewsRepository>().As<INewsRepository>();
Run Code Online (Sandbox Code Playgroud)
更新:
我的IMapper界面:
public interface IMapper
{
object Map(object source, Type sourceType, Type destinationType);
}
Run Code Online (Sandbox Code Playgroud)
我的NewsMapper类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我执行映射的控制器操作方法:
[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");
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是IMapper
合同的广泛性.它太笼统了 - NewsController
想要映射类似的东西News
,NewsViewModel
但IMapper
只是说"将东西映射到某种东西".
相反,请看一下如何创建一个通用变体IMapper<TFrom,TTo>
.然后,您可以设置容器,以便NewsController
接收IMapper<News,NewsModel>
明确且应该唯一匹配NewsMapper
组件的容器(但是您决定将其设置为.)
编辑
有关通用映射器主题的示例/变体,请参阅:
归档时间: |
|
查看次数: |
1004 次 |
最近记录: |