最近在公司项目中使用了Autofac,本人需要解决的问题比较特别,就是需要在单元测试时候替换实际处理的类,通过模拟数据库操作完成单元测试。

本人是个懒惰的程序员,因为不想修改autofac的配置文件,又要结合fakes进行模拟,在网上又未发现类似处理方法,所以特把自己的做法共享出来,供大家参考和改进。

因为实际代码为公司项目,未能尽列代码请见谅,同时认为应该还有更好的改进方案,请有更好想法的朋友分享。

部分参考代码
------------------------------------------------

 DAO管理器:

 /// <summary>
    /// Dao 管理器
    /// </summary>
    public class DaoBag
    {
        #region 防实例静态化
		/// <summary>
		/// 获取实例
		/// </summary>
		public static DaoBag Instance
		{
			get
			{
				return Nested.instance;
			}
		}
		/// <summary>
		/// 密封的内部嵌套辅助类,辅助创建单例对象
		/// </summary>
		sealed class Nested
		{
			// 静态钩子
			static Nested()
			{
			}
			/// <summary>
			/// 只读类型
			/// </summary>
            internal static readonly DaoBag instance = new DaoBag();
		}
		// 防止直接实例化
        private DaoBag() {
            builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
        }
		#endregion

        ContainerBuilder builder = new ContainerBuilder();
        IContainer container;

        public T GetDao<T>()
        {
            // 延迟加载,第一次使用时候被调用
            if (container == null) container = builder.Build();

            return container.Resolve<T>();
        }

        public void SetDao<T,I>(T t) where T : class
        {
            builder.RegisterInstance<T>(t).As<I>();            
        }
    }

 Config配置(无论单元测试还是实际项目中,配置文件不变,这也是我非常需要偷懒的地方)

IOC容器Autofac的另类使用
<configuration>
    <configSections>
        <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
    </configSections>
<autofac defaultAssembly="Model">
    <components>
        <component type="Model.Help.HelpNewsRepository, Model" service="Model.Help.IHelpNewsRepository" />
        <component type="Model.Pri.PriUserRepository, Model" service="Model.Pri.IPriUserRepository" />
    </components>
</autofac>
</configuration>
View Code

相关文章: