Asp.net 同一解决方案中两个MVC项目的依赖项注入问题

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。但这将创建一个循环依赖项

我有一个带有单个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();}
}
}