我有一个带有单个MVC项目的Web解决方案。我在这个项目中使用Ninject绑定进行构造函数注入,它工作正常。现在我将另一个MVC项目添加到同一个解决方案中,并在这个新项目中使用了构造注入。新项目成为启动项目。但是当项目运行时,它将给出一个名为“没有为此对象定义的无参数构造函数”的错误。如果我在相应的控制器中添加无参数构造函数,则此错误将消失。但是,由于此时调用无参数构造函数,因此不会发生构造函数绑定。我甚至尝试创建一个单独的库来依赖解析并在MVC项目中使用该DLL。但这会产生循环依赖,因此不成功。 这种情况应该是什么解决方案?
答案 0 :(得分:0)
我过去通过调用MapperConfig.RegisterMaps();
中的Global.asax.cs
并将RegisterMaps()
方法定义如下来解决了这个问题:
public class MapperConfig
{
public static void RegisterMaps()
{
//get all projects' AutoMapper profiles using reflection
var assembliesToScan = System.AppDomain.CurrentDomain.GetAssemblies();
var allTypes = assembliesToScan.SelectMany(a => a.ExportedTypes).ToArray();
//depending on your solution, you may need allTypes to be defined as:
//var allTypes = assembliesToScan.Where(x => !x.IsDynamic).SelectMany(a => a.ExportedTypes).ToArray();
var profiles =
allTypes
.Where(t => typeof(Profile).GetTypeInfo().IsAssignableFrom(t.GetTypeInfo()))
.Where(t => !t.GetTypeInfo().IsAbstract);
//add each profile to our static AutoMapper
Mapper.Initialize(cfg =>
{
foreach (var profile in profiles)
{
cfg.AddProfile(profile);
}
});
}
}
然后在解决方案的每个项目中,您可以拥有单独的automapper配置文件(我喜欢这样,以便在使用它们的层中定义您的automapper绑定,而不是将所有映射投入到一个巨大的文件中),如下所示:
public class AutoMapperServicesConfig : Profile
{
public AutoMapperServicesConfig()
{
CreateMap<Entity, EntityViewModel>();
}
public override string ProfileName
{
get { return this.GetType().ToString(); }
}
}