首先从最常用的数据获取块开始下手。

我们每次使用数据获取块首先做的就是得到一个Database

Database db = DatabaseFactory.CreateDatabase()

我们首先从DatabaseFactory着手

从名字上即可以猜测,DatabaseFactory是工厂模式的应用,用来创建一个恰当的Database。我们知道DAAB是兼容多种数据库的(MSSQL,Oracle等),因此所创建的Database应该是特异化的Database,比如SqlDatabase,从源代码的结构上看也是这样的。

微软企业库源码解析——DAAB(一)DatabaseFactory

再来看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中的类,没有源码。

今天的工作先到这里了。

相关文章:

  • 2021-06-04
  • 2021-11-11
  • 2021-11-16
  • 2021-11-19
  • 2022-01-04
  • 2022-12-23
  • 2022-03-10
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-06
  • 2021-06-12
  • 2022-12-23
  • 2021-09-14
相关资源
相似解决方案