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直接构造映射类,并在映射类的默认公共构造函数不存在时引发异常。