首先从最常用的数据获取块开始下手。
我们每次使用数据获取块首先做的就是得到一个Database
Database db = DatabaseFactory.CreateDatabase()
我们首先从DatabaseFactory着手
从名字上即可以猜测,DatabaseFactory是工厂模式的应用,用来创建一个恰当的Database。我们知道DAAB是兼容多种数据库的(MSSQL,Oracle等),因此所创建的Database应该是特异化的Database,比如SqlDatabase,从源代码的结构上看也是这样的。
再来看DatabaseFactory的代码
class DatabaseFactory
DatabaseFactory是一个静态类,其中只含有静态方法
string instanceName)
我们关注的是CreateDatabase方法,这两个方法差不多,不过一个是得到默认Database一个是得到指定的Database
static Database CreateDatabase()
2: {
try
4: {
new DatabaseProviderFactory(ConfigurationSourceFactory.Create());
return factory.CreateDefault();
7: }
catch (ConfigurationErrorsException configurationException)
9: {
);
11:
throw;
13: }
14: }
从上面的代码我们可以发现DatabaseFactory是从DatabaseProviderFactory获得了Database并返回的,同时尝试把发生的错误记录下来,然后异常又被再次抛出了。
对于异常的处理并不是我们关心的,我们继续去看DatabaseProviderFactory。
class DatabaseProviderFactory : NameTypeFactoryBase<Database>
2: {
/// <summary>
/// with the default configuration source.</para>
/// </summary>
protected DatabaseProviderFactory()
base()
9: {
10: }
11:
/// <summary>
/// with the given configuration source.</para>
/// </summary>
public DatabaseProviderFactory(IConfigurationSource configurationSource)
base(configurationSource)
19: {}
20:
21: }
可以知道,DatabaseFactory用ConfigurationSourceFactory创建的一个配置源装配了DatabaseProviderFactory。看来重点在NameTypeFactoryBase上。
我们来看NameTypeFactoryBase。
/// <summary>
/// Base class for instance factories.
/// </summary>
/// <remarks>
/// by a configuration source.
/// </remarks>
class NameTypeFactoryBase<T>
9: {
private IConfigurationSource configurationSource;
11:
/// <summary>
/// </summary>
protected NameTypeFactoryBase()
this(ConfigurationSourceFactory.Create())
17: {
18: }
19:
/// <summary>
/// </summary>
protected NameTypeFactoryBase(IConfigurationSource configurationSource)
25: {
this.configurationSource = configurationSource;
27: }
28:
/// <summary>
/// </summary>
/// <returns>
/// </returns>
public T CreateDefault()
36: {
return EnterpriseLibraryFactory.BuildUp<T>(configurationSource);
38: }
39:
/// <summary>
/// </summary>
/// <returns>
/// </returns>
string name)
48: {
return EnterpriseLibraryFactory.BuildUp<T>(name, configurationSource);
50: }
51: }
回忆DatabaseFactory类,在创建了一个DatabaseProviderFactory后即调用了其Create或CreateDefault方法,这两个方法都是由NameTypeFactoryBase<Database>继承的。从这里可以看出,NameTypeFactoryBase用EnterpriseLibraryFactory从配置源读取配置并装配了Database类。
我们继续挖掘到EnterpriseLibraryFactory类。
class EnterpriseLibraryFactory
这也是一个静态类。这个类代码比较多,我就拣几段重要的贴上来。
static EnterpriseLibraryFactory()
2: {
new Builder();
new StagedStrategyChain<BuilderStage>();
5: stagedStrategyChain.AddNew<ConfigurationNameMappingStrategy>(BuilderStage.PreCreation);
6: stagedStrategyChain.AddNew<LocatorLookupStrategy>(BuilderStage.PreCreation);
7: stagedStrategyChain.AddNew<ConfiguredObjectStrategy>(BuilderStage.PreCreation);
8: stagedStrategyChain.AddNew<InstrumentationStrategy>(BuilderStage.PostInitialization);
9: strategyChain = stagedStrategyChain.MakeStrategyChain();
10: }
static T BuildUp<T>(IConfigurationSource configurationSource)
2: {
null, configurationSource);
4: }
5:
static T BuildUp<T>(IReadWriteLocator locator,
7: ILifetimeContainer lifetimeContainer,
8: IConfigurationSource configurationSource)
9: {
null)
);
12:
try
14: {
return GetObjectBuilder()
16: .BuildUp<T>(locator,
17: lifetimeContainer,
18: GetPolicies(configurationSource),
19: strategyChain,
20: NamedTypeBuildKey.Make<T>(),
null);
22:
23: }
catch (BuildFailedException e)
25: {
// look for the wrapped ConfigurationErrorsException, if any, and throw it
27: ConfigurationErrorsException cee = GetConfigurationErrorsException(e);
null)
29: {
throw cee;
31: }
32:
// unknown exception, bubble it up
throw;
35: }
36: }
static PolicyList GetPolicies(IConfigurationSource configurationSource)
2: {
new PolicyList();
new ConfigurationObjectPolicy(configurationSource),
typeof(IConfigurationSource));
new ReflectionCachePolicy(reflectionCache),
typeof(IReflectionCachePolicy));
8:
return policyList;
10: }
11:
static IBuilder GetObjectBuilder()
13: {
return builder;
15: }
16:
static IConfigurationSource ConfigurationSource
18: {
return ConfigurationSourceFactory.Create(); }
20: }
熟悉Unity的朋友应该能猜到,大概是按照StrategyChain对Database进行了装配。
现在关键就在builder上了,可是Builder是ObjectBuilder2中的类,没有源码。
今天的工作先到这里了。