Asp.net 同一解决方案中两个MVC项目的依赖项注入问题
我有一个带有单个MVC项目的web解决方案。我在这个项目中使用了Ninject绑定进行构造函数注入,效果很好。现在,我在同一个解决方案中添加了另一个MVC项目,并在这个新项目中使用了构造注入。新项目成为启动项目。但是当项目运行时,它将给出一个名为“没有为此对象定义无参数构造函数”的错误。如果我在相应的控制器中添加一个无参数构造函数,这个错误就会消失。但此时调用无参数构造函数时,将不会发生构造函数绑定。我甚至尝试创建一个独立的库来解析依赖关系,并在MVC项目中使用该DLL。但这将创建一个循环依赖项,因此没有成功。Asp.net 同一解决方案中两个MVC项目的依赖项注入问题,asp.net,asp.net-mvc,web,dependency-injection,ninject,Asp.net,Asp.net Mvc,Web,Dependency Injection,Ninject,我有一个带有单个MVC项目的web解决方案。我在这个项目中使用了Ninject绑定进行构造函数注入,效果很好。现在,我在同一个解决方案中添加了另一个MVC项目,并在这个新项目中使用了构造注入。新项目成为启动项目。但是当项目运行时,它将给出一个名为“没有为此对象定义无参数构造函数”的错误。如果我在相应的控制器中添加一个无参数构造函数,这个错误就会消失。但此时调用无参数构造函数时,将不会发生构造函数绑定。我甚至尝试创建一个独立的库来解析依赖关系,并在MVC项目中使用该DLL。但这将创建一个循环依赖项
这种情况的解决方案应该是什么?我过去通过调用
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(); }
}
}
公共类自动映射服务配置:配置文件
{
公共自动映射服务配置()
{
CreateMap();
}
公共重写字符串配置文件名
{
get{返回this.GetType().ToString();}
}
}
我以前通过调用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(); }
}
}
公共类自动映射服务配置:配置文件
{
公共自动映射服务配置()
{
CreateMap();
}
公共重写字符串配置文件名
{
get{返回this.GetType().ToString();}
}
}