I'm working on an application which uses Automapper, Unit Of Work, Entity Framework 5, ASPNET MVC 4, WebApi and Windsor Castle from Nuget.
I'm not sure if I should map this or it should be mapped by Automapper automatically
public IEnumerable<StoreDto> Get()
{
return Uow.Stores.GetAll().OrderBy(s => s.Name);
}
Uow.Stores.GetAll().OrderBy(s => s.Name)
returns an IOrderedQueryable<Store>
.
I'm receiving the error message
Cannot convert expresion type IOrderedQueryable to type IEnumerable
Should I do a foreach and convert each object returned by GetAll
to StoreDto
with Mapper.Map
method of Automapper? Wouldn't Automapper convert it for me?
This is how I'm using Automapper and how I'm registering it. Please let me know if something should/can be improved.
AutomapperInstaller.cs
:
public class AutoMapperInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
Mapper.Initialize(x => x.ConstructServicesUsing(container.Resolve));
RegisterProfilesAndResolvers(container);
RegisterMapperEngine(container);
}
private void RegisterMapperEngine(IWindsorContainer container)
{
container.Register(Component.For<IMappingEngine>().Instance(Mapper.Engine));
}
private void RegisterProfilesAndResolvers(IWindsorContainer container)
{
// register value resolvers
container.Register(AllTypes.FromAssembly(Assembly.GetExecutingAssembly()).BasedOn<IValueResolver>());
// register profiles
container.Register(AllTypes.FromThisAssembly().BasedOn<Profile>());
var profiles = container.ResolveAll<Profile>();
foreach (var profile in profiles)
{
Mapper.AddProfile(profile);
}
}
WebWindsorInstaller
:
internal class WebWindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component
.For<RepositoryFactories>()
.ImplementedBy<RepositoryFactories>()
.LifestyleSingleton());
container.Register(Component
.For<IRepositoryProvider>()
.ImplementedBy<RepositoryProvider>()
.LifestylePerWebRequest());
container.Register(Component
.For<IProjUow>()
.ImplementedBy<ProjUow>()
.LifestylePerWebRequest());
container.Register(Classes
.FromAssemblyContaining<Api.StoresController>()
.BasedOn<IHttpController>()
.If(t => t.Name.EndsWith("Controller"))
.LifestylePerWebRequest());
RegisterMapping(container, store);
}
private void RegisterMapping(IWindsorContainer container, IConfigurationStore store)
{
Mapper.CreateMap<Store, StoreDto>();
}
}
Store.cs
:
public class Store
{
public Store()
{
this.Branches = new List<Branch>();
}
public int Id { get; set; }
public string Name { get; set; }
public System.Data.Spatial.DbGeography Location{ get; set; }
public virtual ICollection<Branch> Branches{ get; set; }
}
StoreDto.cs
(same as Store by now)
public class StoreDto
{
public StoreDto()
{
this.Branches = new List<BranchDto>();
}
public int Id { get; set; }
public string Name { get; set; }
public System.Data.Spatial.DbGeography Location{ get; set; }
public virtual ICollection<BranchDto> Branches{ get; set; }
}
And this is how I'm calling the installer in IocConfig.cs
:
Container = new WindsorContainer()
.Install(new AutoMapperInstaller())
.Install(new ControllersInstaller());
I'm not sure if I should include there
.AddFacility<FactorySupportFacility>()