我有一个用C#编写的Windows窗体应用程序。 main_form类实例化一个名为AccessProcessWorker的AccessProcess,它是一个继承自BackgroundWorker的类,然后main_form然后使用以下代码初始化Process
AccessProcessWorker.DoWork += new DoWorkEventHandler(processWorker.worker_DoWork);
AccessProcessWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(processWorkerCompleted);
AccessProcessWorker.ProgressChanged += new ProgressChangedEventHandler(processProgressChanged);
这个应用程序刚刚从POC转到“让它快速工作”。
我编写了这个应用程序来对抗Access数据库,但是现在想要使它针对MS Sql,但是也可以选择反对访问。所以,我可以做一些丑陋的事情,比如实例化并根据用户做出的一些UI选择初始化SqlProcessWorker或AccessProcessWorker。但是我想做的是使main_form始终创建类似于IProcess的东西,所以每次有新的ProcessWorker时我都不必为main_form添加逻辑。我的设计中的问题是,当我按照我描述的方式进行初始化时会中断。
如果有任何想法,或需要进一步的侮辱请告诉我。
答案 0 :(得分:4)
您所寻找的内容称为“依赖注入”。
答案 1 :(得分:2)
在某些时候,您需要实例化正确的类型,但The Factory Pattern通常是这里的goto。现在,如果您只有两种类型中的一种来获取“新”以获取IProcess对象,那么这可能会有点多。
答案 2 :(得分:2)
为了保持简单,我实际上只是采用“丑陋”的方法。
您已经将Access和SQL Server视为两个当前数据库,但您有多少人认为您的应用需要支持?根据我的经验,应用程序的数据库平台很少被改变,并且没有认真思考。
如果有大量的数据库平台需要支持而你无法提前预测,那么解耦设计可能会有用。否则KISS。
答案 3 :(得分:1)
如果两个数据库的布局和结构相同,则只需使用EntitySpaces并更改应用程序的默认连接。即您在数据访问方面有一个代码库,然后根据您是否需要Access或SQL数据库来设置当前连接。
答案 4 :(得分:1)
我会将“丑陋”的代码包装在一个单独的方法中,或者最好是一个类,它负责选择与哪个DB进行通信以及与实际的BackgroundWorker实例同步。这里重点是遵守DRY原则:不要重复自己。
答案 5 :(得分:0)
我认为对于一个工作项目,你应该尽可能快地做到这一点,而不考虑未来的数据库,因为它可能不会发生。
你确定在某个地方没有可以同时使用Sql Server和MS Access的类吗?例如,OleDbConnection
,OleDbCommand
?
对于简单的SQL,您只需要更改连接字符串,就可以使用这两个数据库。
如果您还没有对应用程序的其余部分进行编码,那么您应该花一两天的时间来寻找一些框架,比较并选择您喜欢的框架。它会让你编写更少的代码,在将来的应用程序中,你将免于大部分数据库管道代码。我保证投入的时间会多次返还给您(如果您偶尔使用数据库,那就是)。