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

时间:2017-11-13 16:20:43

标签: asp.net asp.net-mvc web dependency-injection ninject

我有一个带有单个MVC项目的Web解决方案。我在这个项目中使用Ninject绑定进行构造函数注入,它工作正常。现在我将另一个MVC项目添加到同一个解决方案中,并在这个新项目中使用了构造注入。新项目成为启动项目。但是当项目运行时,它将给出一个名为“没有为此对象定义的无参数构造函数”的错误。如果我在相应的控制器中添加无参数构造函数,则此错误将消失。但是,由于此时调用无参数构造函数,因此不会发生构造函数绑定。我甚至尝试创建一个单独的库来依赖解析并在MVC项目中使用该DLL。但这会产生循环依赖,因此不成功。 这种情况应该是什么解决方案?

1 个答案:

答案 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(); }
    }
  }