package com.hg.ecommerce.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.hg.ecommerce.dao.support.IProjections;
import com.hg.ecommerce.dao.support.ISQLProvider;
import com.hg.ecommerce.model.support.FieldTypeMapper;
/**
* 在程序运行时动态绑定接口与实现类,免去冗余配置信息修改
* @author lihe
*
*/
public class ProjectContainer extends AbstractModule{
/**
* build guice Injector, based on current Module
*/
private static Injector injector = Guice.createInjector(new ProjectContainer());
/**
* Expose only this method to developer, get Instance by passing the correspondent Interface.
* @param cls
* @return
*/
public static <T> T getInstance(Class<T> cls){
return injector.getInstance(cls);
}
@SuppressWarnings("unchecked")
@Override
protected void configure() {
//get db name
String dbName = ProjectConfig.getProperty("db.name");
//get mapper class name
String fieldTypeMapperCls = ProjectConfig.getProperty(dbName+".field");
//get sql dialect class name
String sqlDialectCls = ProjectConfig.getProperty(dbName+".sql");
//get projection class name
String sqlProjections = ProjectConfig.getProperty(dbName+".projection");
/**
* No Handler, We do not allow this.
*/
if(dbName==null||fieldTypeMapperCls==null||sqlDialectCls==null||sqlProjections==null){
throw new RuntimeException("Unhandled Provider, You should at least choose One provider for your dbms. Check the properties config file exists?");
}
/**
* Real bind start here, wrap it with exceptions
*/
try {
//dynamic bind
bind(FieldTypeMapper.class).to((Class<? extends FieldTypeMapper>)Class.forName(fieldTypeMapperCls));
bind(ISQLProvider.class).to((Class<? extends ISQLProvider>)Class.forName(sqlDialectCls));
bind(IProjections.class).to((Class<? extends IProjections>)Class.forName(sqlProjections));
bind(ObjectMapper.class).toInstance(new ObjectMapper());
} catch (Exception e) {
e.printStackTrace();
}
}
}