[C#|Reflection]Nhibernate vindt klasse niet

Pagina: 1
Acties:

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
Even eerst wat info:

Assemblies:
MyProg.Interfaces -> bevat alle interfaces
MyProg.Data -> bevat businessobjects en een abstracte filemanger
MyProg.Data.Default -> bevat een default implementatie van de filemanger
=> referentie: MyProg.Data
MyProg.Data.NHibernated -> bevat de NHibernate implementatie van de filemanager
=> referentie: MyProg.Data
=> alle .hbm.xml files als embedded resource
MyProg -> basisprogramma + service layer.

in de service layer laad ik mbv Reflection de NHibernated datamanager.
C#:
1
2
3
4
5
foreach (Type type in fmanass.GetTypes())
{
    if (type.IsClass && !type.IsAbstract && type.GetInterface(typeof(IFileManager).ToString(),true) != null)
        filemanager = (IFileManager)type.GetConstructor(new Type[] { typeof(IServices) }).Invoke(new object[] { this });
}

de constructor wordt dus goed aangeroepen (bij de Default is dit geen probleem)
binnen de constructor van de NHibernated filemanager laad ik alle types door de Assembly mee te geen aan de NHibernate Configuration klasse:
C#:
1
2
3
4
5
6
7
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.SetProperty("hibernate.connection.provider", "NHibernate.Connection.DriverConnectionProvider");
cfg.SetProperty("hibernate.connection.driver_class", "NHibernate.Driver.SqlClientDriver");
cfg.SetProperty("hibernate.dialect", "NHibernate.Dialect.MsSql2000Dialect");
cfg.AddAssembly(System.Reflection.Assembly.GetExecutingAssembly());
cfg.Configure();
sessions = cfg.BuildSessionFactory();

op zich gaat dit lekker, ware het niet dat die een exceptie gooit:
"Could not load MyProg.Data.SomeBusinessObject"
Een beetje dieper in de exeptie vind ik dan dat hij deze probeert te laden vanuit de NHibernate assembly wat natuurlijk niet kan.

via de stacktrace en de broncode van NHibernate ben ik op dit fragment gekomen:
C#:
1
2
3
4
public static System.Type ClassForName( string name )
{
    return System.Type.GetType( name.Trim(), true ); // hier wordt de exceptie dus geworpen
}

de name parameter die deze functie mee krijgt zou (volgens de .hbm.xml file) dit moeten zijn:
"MyProg.Data.SomeBusinessObject, MyProg.Data"
ook met de AssemblyFullQualifiedName heb ik al geprobeerd en verscheidene andere dingen.

de MSDN vind ik voor deze functie nogal cryptisch. maar het lijkt me alsof deze Assembly wel geladen zou moeten zijn (aangezien ik em als referentie gebruik, en aangezien m'n klasse van de abstracte filemanager afgeleid is).

maw: hoe maak ik dat NHibernate wel de juiste klasse kan laden?

edit:
Ik heb nu ook in m'n constructor andere methodes geprobeerd:
C#:
1
cfg.AddClass(typeof(SomeBusinessObject));

en dan klaagt ie dat ie de .hbm.xml file niet kan vinden.

wil dit dan zeggen dat er geen enkele andere manier is om die .hbm.xml file en de klasse in een aparta assembly te houden?

[ Voor 9% gewijzigd door H!GHGuY op 30-10-2005 11:24 ]

ASSUME makes an ASS out of U and ME


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
Volgens mij moet je de hbm.xml files en de domain objecten niet in dezelfde assembly hebben, al heb ik het zelf nooit uitgeprobeerd.
Je moet je Assembly adden waar de hbm.xml files zich in bevinden.

https://fgheysels.github.io/


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
dat doe ik ook...
die Assembly die ik toevoeg is deze met de .hbm.xml bestanden...

in die xml bestanden staat overigens:
XML:
1
2
3
4
5
6
7
8
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-access="property" namespace="MyProg.Data">
    <class name="MyProg.Data.SomeBusinessObject, MyProg.Data" table="objects">
        <id name="ID" unsaved-value="-1" access="nosetter.lowercase">
            <generator class="native"/>
        </id>
        <property name="Name"/>
       </class>
</hibernate-mapping>


dus de assembly staat gespecifieerd

ASSUME makes an ASS out of U and ME


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
Nee toch?
Jij doet dit:
code:
1
cfg.AddAssembly(System.Reflection.Assembly.GetExecutingAssembly());

Jij voegt de assembly die nu a/h uitvoeren is toe.

https://fgheysels.github.io/


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
jup want dat is de assembly waarin ook de .hbm.xml files staan (MyProg.Data.NHibernated dus)

ASSUME makes an ASS out of U and ME


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
ok nm...

ik heb het (na 2 dagen zoeken) gevonden.

voor het nageslacht:
XML:
1
2
3
4
5
6
7
8
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-access="property" namespace="MyProg.Data">
    <class name="MyProg.Data.SomeBusinessObject, MyProg.Data" table="objects" assembly="MyProg.Data">
        <id name="ID" unsaved-value="-1" access="nosetter.lowercase">
            <generator class="native"/>
        </id>
        <property name="Name"/>
       </class>
</hibernate-mapping>


het assembly attribuut van de class node had ik niet. Waardoor hij in de foute assemblies ging zoeken

ASSUME makes an ASS out of U and ME

Pagina: 1