【问题标题】:DataProvider Switch / Singleton ?数据提供者开关/单例?
【发布时间】:2011-03-21 16:56:51
【问题描述】:

我有一个网站,想从 MySql 跨步到 SqlServer。

在我的网站中,我使用了 BE 层(业务实体)、BLL(业务逻辑层)、DAL(数据访问层),当然还有 Web 层(网站)

我在 web.config(应用程序设置)中创建了一个开关,告诉网站使用 MySql 或 SqlServer 作为 DataProvider。

我使用以下代码....完美运行,但我的问题是...

  • 这是使用多 DAL 层的正确方法吗?
  • 这个线程安全吗?还是我必须在 Factory 类中实现 Singleton?

请告诉我你应该做什么,或者你的意见是什么。

namespace MyNameSpace.BE {
    public class Product {
        public int Id { get; set; }
        public int Description { get; set; }
    }
}
namespace MyNameSpace.DAL.Base {
    public abstract class ProductManager {
        public abstract List<Product> GetProductList();
    }
}
namespace MyNameSpace.DAL.MySql {
    public class ProductManager : Base.ProductManager {
        public override List<Product> GetProductList() {
            return new List<Product>();
        }
    }
}
namespace MyNameSpace.DAL.SqlServer {
    public class ProductManager : Base.ProductManager {
        public override List<Product> GetProductList() {
            return new List<Product>();
        }
    }
}

namespace MyNameSpace.Bll {

    /// do I have to use Singleton here ?? or not ?
    public static class Factory {

        private static ProductManager CreateProductManager() {

            if (Config.Settings.Switches.DataProvider == DataProvider.MySql) {
                return new DAL.MySql.ProductManager();
            } else if (Config.Settings.Switches.DataProvider == 
                                 DataProvider.SqlServer) {
                return new DAL.SqlServer.ProductManager();
            }
            return null;
        }

        private static ProductManager _ProductManager;
        public static ProductManager ProductManager {
            get {
                if (_ProductManager == null) {
                    _ProductManager = CreateProductManager();
                }
                return _ProductManager;
            }
        }
    }
}

/// <summary>
/// for example ASP.NET page
/// </summary>
class MyPage {

    public MyPage() {
        List<Product> productList = Factory.ProductManager.GetProductList();
    }

}

【问题讨论】:

  • 这可行,但您也可以使用 IoC 容器来做同样的事情,从而节省几行代码。

标签: c# singleton layer dataprovider


【解决方案1】:

我建议您使用控制反转 (IoC) 容器。在 Microsoft Unity 中可以找到一个这样的 IoC 容器。

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 2017-11-05
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多