Hello,
First I want to say that your framework is very nice. Second, I am new to this whole structure, sorry for any wrong statement.
My question is, does the framework support multiple sessions ? If yes, how can I do that?
I mean, my WebSite have two or more connection string, how can I implement that using the NHibernate and DI ?
I did something like the sample "PhoneBook", creating two "xDependencyInstaller", where I created my "CreateNhSessionFactory" there, but when I use two connection string I got an error by castle ioc, saying that I can´t register same assembly (SessionFactory) more than once.
Now I am trying to use like the "SimpleTaskSystem" sample, but I don´t know how to achieve my goals .
PS: I am trying to change the framework to work with nhibernate map by code, so I dont need to use Fluent.
Thanks. Bruno
7 Answer(s)
-
0
Hi,
ABP does not natively supports more than one database for NHibernate. But I may help you based on your needs. Why do you need it? Do you need to second DB for a limited scope or usage of these 2 databases are balanced?
-
0
Hello, thanks for the response.
Actually its not 2 DB for the same NHibernate project. let me give you a sample.
I have a financial market system with 3 separated projects: 1 responsible for user authentication and user Data (1 DB) 1 responsible for common searches shared on other systems (1 DB) 1 responsible for the main system operations, like BL, CRUD, etc (1 DB)
Following your samples, I will have 3 different NHibernates class libraries right ? each of them containing my Dependency installers.
So its 3 separated projects that I will use on my asp.net MVC website, How should I install the references there using DI, on the global.asax?
EDIT: Maybe my question is more on the Castle Windsor side. The part that registers the assemblys.
_windsorContainer.Install(FromAssembly.Containing<PineClientesDependencyInstaller>());
i want to install 2 assembly DependencyInstaller, but got an error saying that ISession from nhibernate is already installed.
Its something like this: [http://stackoverflow.com/questions/3351268/what-is-a-correct-approach-to-register-several-instances-for-the-same-type-in-wi])
But if I use that, how do I know which NhRepositoryBase ISession is going to use, DB1 or DB2
Thanks Bruno
-
0
Hello hikalkan
You was able to check if this is possible?
I was looking to you SimpleTaskSystem sample, basically I want to have two or more "SimpleTaskSystemDataModule" so on theirs PreInitialize method I have my DB configs.
How can I register that using DI ? The framework repositories will know which ISession to use ?
Thanks
-
0
Hi,
I thought a bit, it's probably not possible without changing something in the framework (probably starting from NhUnitOfWork).
It may be accomplished in a limited scope. Your main db remains same, you can do some special thing for additional dbs. If you check NhRepositoryBase class (<a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate/blob/master/src/Abp.NHibernate/NHibernate/Repositories/NhRepositoryBaseOfTEntityAndTPrimaryKey.cs">https://github.com/aspnetboilerplate/as ... maryKey.cs</a>), it gets a ISessionProvider in it's constructor which is used to perform database operations. So, you can create a class that implements ISessionProvider and create custom repositories (<a class="postlink" href="http://www.aspnetboilerplate.com/Pages/Documents/NHibernate-Integration">http://www.aspnetboilerplate.com/Pages/ ... ntegration</a>) that injects your session provider. Another way could be create and implement your own repositories that works with different session factories. I can not say exact solution without coding and trying.
-
0
Hi, thanks for the feedback.
Yes, I think I am going to make some changes on the framework, already did some because I don´t use the Fluent NHibernate. I will try those approach and let you know.
Maybe I will create an SessionFactory dictionary, and inject the specific one on repositories, by name .
I am really new to this that's why I have all those doubts =).
Thanks again. Bruno
-
0
Hello again.
I did some changes on PineNHibernateModule and builded 2 SessionFactory, but I am back to that error :
"Component Late bound NHibernate.ISessionFactory could not be registered. There is already a component with that name. Did you want to modify the existing component instead? If not, make sure you specify a unique name."
I changed NhRepositoryInstaller to receive a custom name:
container.Register( Component.For<ISessionFactory>() .Named(_sessionFactoryName) .UsingFactoryMethod(() => _sessionFactory) .LifeStyle.Singleton ); container.Register( Component.For(typeof(IRepository<>)) .ImplementedBy(typeof(NhRepositoryBase<>)) .LifestyleTransient(), Component.For(typeof(IRepository<,>)) .ImplementedBy(typeof(NhRepositoryBase<,>)) .LifestyleTransient() );
So, i have 2 session now, but I am not understanding how can I inject my session to my repository, can you exemplify for me ?
thanks
-
0
Hi,
You can not register same interface twice.. If so, how DI can know which should be injected when requested. You can create a different class that use your 2nd session factory, you can write a simple adapter and so on.