Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#NHibernate:如何将构造函数注入到类映射派生类中?_C#_Nhibernate_Mapping By Code - Fatal编程技术网

C#NHibernate:如何将构造函数注入到类映射派生类中?

C#NHibernate:如何将构造函数注入到类映射派生类中?,c#,nhibernate,mapping-by-code,C#,Nhibernate,Mapping By Code,我是新来的NHibernate。不知何故,我无法找到我的问题的答案。 所以让我在这里问一下 如何将依赖项注入到类中,如下所示: /* public abstract class ByCodeAutoClassMapping<T> : ClassMapping<T> where T : EntityBase ... etc */ using App.Data.Persistence.Infrastructure; using App.D

我是新来的
NHibernate
。不知何故,我无法找到我的问题的答案。 所以让我在这里问一下

如何将依赖项注入到类中,如下所示:

/*
  public abstract class ByCodeAutoClassMapping<T> : ClassMapping<T> where T : EntityBase ... etc
 */
using App.Data.Persistence.Infrastructure;
using App.Data.Persistence.Infrastructure.Builders;
using Domain;
using NHibernate.Mapping.ByCode;

namespace Persistence.Auto.Mappings
{
    public class EmployeeMapping : ByCodeAutoClassMapping<Employee>
    {
        protected override void InitCustomMappings(TableMapBuilder<Employee> tableMapping)
        {
            Schema("test");
        }
    }
}
/*
公共抽象类ByCodeAutoClassMappingT:ClassMappingT其中T:EntityBase。。。等
*/
使用App.Data.Persistence.Infrastructure;
使用App.Data.Persistence.Infrastructure.Builders;
使用领域;
使用NHibernate.Mapping.ByCode;
命名空间持久性.Auto.Mappings
{
公共类EmployeeMapping:ByCodeAutoClassMappingEmployee
{
受保护的覆盖无效InitCustomMappings(TableMapBuilder tableMapping)
{
模式(“测试”);
}
}
}
有没有办法先将持久性类注册到一些
IoC
容器中,然后将这些注册提供给
NHibernate


谢谢

您应该能够按照约定注册映射类。比如:

yourContainer.Register(AllTypes.DerivedFrom(typeof(ByCodeAutoClassMapping<>));
yourContainer.Register(AllTypes.DerivedFrom(typeof(ByCodeAutoClassMapping));
当您需要向NH注册映射类型时,您应该能够使用IoC容器来解析它们:

nhMappingTypes = yourContainer.Resolve(typeof(ByCodeAutoMapping<>));
nhMappingTypes=yourcainer.Resolve(typeof(bycode自动映射));

我实现了一个从ModelMapper派生的新类,并更改了两个方法的两个实现:“AddMappings”和“AddMapping”,但使用另一个名称,在新型ModelMapper的构造函数中接收必要的参数。在我的实现中,ModelMappings中的必要参数是Ision类型的对象,但它可以是什么您需要的任何类型:

public class FenixModelMapper : ModelMapper {
//Here
private readonly ISesion _sesion;


public FenixModelMapper(ISesion sesion)
{
  _sesion = sesion;
}

public void AgregarMappings(IEnumerable<Type> types)
{
  if (types == null)
  {
    throw new ArgumentNullException("types");
  }

  foreach (var type in types.Where(x =>
    typeof(IConformistHoldersProvider).IsAssignableFrom(x) && !x.IsGenericTypeDefinition))
  {
    AgregarMapping(type);
  }
}

private void AgregarMapping(Type type)
{
  object mappingInstance;
  try
  {
    //Here the code, create instante with Reflection passing my object
    mappingInstance = Activator.CreateInstance(type, _sesion);
  }
  catch (Exception e)
  {
    throw new MappingException("Unable to instantiate mapping class (see InnerException): " + type, e);
  }

  var mapping = mappingInstance as IConformistHoldersProvider;
  if (mapping == null)
  {
    throw new ArgumentOutOfRangeException("type",
      "The mapping class must be an implementation of IConformistHoldersProvider.");
  }

  AddMapping(mapping);
}
公共类FenixModelMapper:ModelMapper{
//这里
私人只读版本;
公共FenixModelMapper(ISesion sesion)
{
_sesion=sesion;
}
公共无效AgregarMappings(IEnumerable类型)
{
如果(类型==null)
{
抛出新的ArgumentNullException(“类型”);
}
foreach(var)在types.Where(x=>
类型(IConformistHoldersProvider).IsAssignableFrom(x)&&&!x.IsGenericTypeDefinition)
{
无规则映射(类型);
}
}
私有void AgregarMapping(类型)
{
对象映射实例;
尝试
{
//下面是代码,创建反射通过我的对象的Instant
mappingInstance=Activator.CreateInstance(类型,session);
}
捕获(例外e)
{
抛出新的MappingException(“无法实例化映射类(请参见InnerException):”+类型,e);
}
var mapping=将实例映射为IConformistHoldersProvider;
if(映射==null)
{
抛出新ArgumentOutOfRangeException(“类型”,
“映射类必须是IConformistHoldersProvider的实现。”);
}
添加映射(映射);
}

过去,我是通过使用NHibernate来实现这一点的,但现在可能有更好的方法。

David您好,谢谢您的回答。实际上,我是这样注册我的映射类的:
var mapper=new ModelMapper();mapper.AddMappings(typeof(EmployeeMappings.Assembly.GetTypes());Configuration.AddMapping(mapper.compileMappingForAllExplicitlyAddedIdentity());
对于这种情况,我不知道如何让NHibernate使用您提到的注册类型。似乎NHibernate直接构造映射类,并在映射类的默认公共构造函数不存在时引发异常。