我正在创建一个asp.net mvc网站,我需要一个建议。我有以下几层:
实际上有几个数据库:
DAO和服务以这种方式“链接”:
MyMainService (contains business logic)
MyMainDao (contains data access functions)
MyMainSessionFactory (session factory for the main database)
MyMainDbProvider (db provider with a connection to the main database)
或:
MyCustomerService (contains business logic)
MyCustomerDao (contains data access functions)
MyCustomerSessionFactory (session factory for the customer database)
MyCustomerDbProvider (db provider with a connection to the main database)
或混合(同时使用两个数据库):
MySuperService (contains business logic)
MyMainDao (contains data access functions)
MyMainSessionFactory (session factory for the main database)
MyMainDbProvider (db provider with a connection to the main database)
MyCustomerDao (contains data access functions)
MyCustomerSessionFactory (session factory for the customer database)
MyCustomerDbProvider (db provider with a connection to the main database)
我在两个提供商中都使用了属性占位符(和PropertyPlaceholderConfigurer)。
在这里我们想要使用这个服务(在ASP.NET MVC控制器中):
如果我想使用MyMainService没有问题 - 我使用DI并且一切正常。
但是如果我想使用MyCustomerService或MySuperService,我认为我不能使用DI,而是更多的“依赖性拉动”。 我认为我应该创建一种“服务工厂”,我将传递一个客户ID和服务工厂 将通过与相应数据库的连接返回给我的服务。类似的东西:
TService GetService<TService>(int customerId)
{
CustomerInfo info = GetCustomerInfo(customerId);
IConfigurableApplicationContext context = (IConfigurableApplicationContext)WebApplicationContext.GetRootContext();
PropertyPlaceholderConfigurer conf = (PropertyPlaceholderConfigurer)context.GetObject("PropertyPlaceholderConfigurer");
conf.Properties["db.datasource"] = info.DataSource;
conf.Properties["db.user"] = info.UserName;
conf.Properties["db.password"] = info.Password;
conf.Properties["db.database"] = info.DatabaseName;
context.AddObjectFactoryPostProcessor(conf);
context.Refresh();
IEnumerator it = context.GetObjectsOfType(typeof(TService)).Values.GetEnumerator();
if (it.MoveNext())
{
return (TService)it.Current;
}
}
这是正确的方法,还是我完全错了,我应该以其他方式做到这一点?
注意:我希望同时为不同的客户使用相同的服务,例如:
IMyService s1 = GetService<IMyService>(1);
IMyService s2 = GetService<IMyService>(2);
s1.importData(s2.exportData());
任何建议都将受到赞赏。
非常感谢!
答案 0 :(得分:0)
在“MySuperService”中,您使用两个bean(MyMainDao和MyCustomerDao)。这是有效的,因为它们有不同的类型(Java类)。
如果您想要一个可以返回的工厂,请使用与“MySuperService”相同的方法,但不要依赖于该类型,请为这两个bean指定不同的名称。这样,您的工厂可以按名称查找它们,您可以说:
connector = factory.lookup("name");