接口定义问题

wufanglu 2010-04-29 08:27:32
以下三个接口,大部分都相同,只是主键定义不一样,怎么编排它们?
是分成三个独立的接口好?
还是把公共的地方提成一个基接口,不同的地方再放到各自的接口中?
或是把这三个合并成一个接口,用不到的方法就以空代码充之?

    public interface IHeaderBll
{
DataRow GetInfoByKey(string key);
DataRow GetInfoExByKey(string key);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string key);
}

public interface IHeader2Bll
{
DataRow GetInfoByKey(string parentKey, string key);
DataRow GetInfoExByKey(string parentKey, string key);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string parentKey, string key);
}

public interface IDetailBll
{
DataRow GetInfoByKey(string key, int seq);
DataRow GetInfoExByKey(string key, int seq);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string key, int seq);
}
...全文
427 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wufanglu 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cosmo_sei 的回复:]

@11楼
可以用泛型方法IDetail.GetInfoByKey<T,K>(T o1, K o2)。

@12楼
分层为了松散耦合便于迁移、代码复用,还有每个人可以关注自己的部分。如果业务不复杂变化又快、又是一个人开发,分太多层不见得好,往往一次改动引起级联修改,从上改到下,维护开发工作更大。
[/Quote]
分的层(继承的层次、模块的层级)太多了,修改起来真的相当麻烦,而且一不小心写死了,后面只能望而生叹。
shixiujin 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wufanglu 的回复:]
@1楼,没理解你的意思。
[/Quote]
lz理解错我的意思了,其实我是没有十足的把握才这样讲的.
其实总结上面各位高手的那些建议不妨采纳一些东西,既然定义了3个接口并且这3个接口中只有GetInfoKey方法签名是不同的,那么就可以将他们提取出来将它们单独声明成接口.另外,至于那些相同的东西可以封装成一个接口.
毕竟"臃肿的接口是对接口的污染"
cosmo_sei 2010-05-09
  • 打赏
  • 举报
回复
@11楼
可以用泛型方法IDetail.GetInfoByKey<T,K>(T o1, K o2)。

@12楼
分层为了松散耦合便于迁移、代码复用,还有每个人可以关注自己的部分。如果业务不复杂变化又快、又是一个人开发,分太多层不见得好,往往一次改动引起级联修改,从上改到下,维护开发工作更大。
wufanglu 2010-04-30
  • 打赏
  • 举报
回复
坏啦,现在层次又多起来了。以前一个继承过十层的主子表录入界面把我整怕了,维护的时候连代码在哪层找都不知道,现在又在搞分层。

Bll层我是用:interface -> abstract_class -> class,已经很多层了。
Dal层我只是实现了几个简单的 GetDataTable(sql)、SaveDataTable(sql, datatable)、GetString(sql),且Dal层是一个封装好的完整工厂模式的Remoting三层结构:SqlBll。

这里的Bll层其实是把原本应放在服务器端的Dal层提到客户端来了。
Model模块也取消了,改为了DataRow,因为泛型不好排序、没有状态、写得太烦锁、太死板。

UI层(WinForm,当然也可以用WebForm)我都不想搞什么继承了,考滤得太多了,这东东要搞到啥时?
现在的时间基本上不是花在写界面,而是花在如何组织结构、精简代码上。在ASP时代写出一个界面算一个界面,要出新界面时 Ctrl+C & Ctrl+V 再稍加改改就OK了。
wufanglu 2010-04-30
  • 打赏
  • 举报
回复
@10楼,
我还是选择第2种方法好,这样清晰点,不然后面维护的人会搞不清 IDetail.GetInfoByKey(object, object) 到底要怎么用。

这不是开发的问题,是做人的问题,做人真难,左右都是错。。。
BasicArchitect 2010-04-30
  • 打赏
  • 举报
回复
我有两个建议。
1.使用标识域,就是说把你的主键作为一个对象处理,具体可以参考《企业应用架构模式》中的相关讨论。
2.提取你的3个接口的公共部分成为一个新的接口,主键不同的接口可以从这个接口继承。
wufanglu 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 njw1028 的回复:]
用一个接口不就完了?方法重载几下不就行了
[/Quote]
弄些没用的东西在里边,到时人家调用 IDetail.GetInfoByKey(string, string) 怎么处理?
实际只有 IDetail.GetInfoByKey(string, int) 这个方法有效。
njw1028 2010-04-30
  • 打赏
  • 举报
回复
用一个接口不就完了?方法重载几下不就行了
wufanglu 2010-04-30
  • 打赏
  • 举报
回复
@1楼,没理解你的意思。

@3、5楼,
提取接口与提取基类一直困扰着我,因为这没绝对的提取与不提取,提取的度很难反握。以前一个主子表录入的界面我数了一下,居然用了十层继承来实现,发现继承一般超过三层的话系统结构就显得拥肿难以维护(本来继承是用来让代码更简洁清晰的)。

@4、6楼,
觉得没什么改变反而更麻泛,而且我们这里很多电脑用的是win2000,烦型的很多功能(.net3.5)用不了。
xray2005 2010-04-29
  • 打赏
  • 举报
回复
public interface IHeader2Bll
{
DataRow GetInfoByKey<T,V>(T parentKey, V key);
DataRow GetInfoExByKey<T, V>(T parentKey, V key);
DataTable GetListByWhere<T>(T sAnd);
DataTable GetListExByWhere<T>(T sAnd);
DataTable GetListLstByWhere<T>(T sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey<T, V>(T parentKey, V key);
}
cosmo_sei 2010-04-29
  • 打赏
  • 举报
回复
我觉得只有几个方法不用,其他都是公用的话可以用一个接口。
在实现过程中如果某个方法用不到就显式实现该方法将这个方法屏蔽掉。

hotyi2003 2010-04-29
  • 打赏
  • 举报
回复
因为只是主键定义不同,可以用GENERIC,
public interface CommandMethod<T>
{
DataRow GetInfoByKey(T primaryKey);
void Delete(T primaryKey);
DataTable GetListByKey(T primaryKey);
}

public class PrimaryKey
{

}


public class Header1PrimaryKey : PrimaryKey {
public string Key{get;set;}
}


public class Header1 : CommandMethod<Header1PrimaryKey>
{
public DataRow GetInfoByKey(Header1PrimaryKey primaryKey)
{
...
}
}
zhehan54 2010-04-29
  • 打赏
  • 举报
回复
我觉得相同的方法放在同一个接口就好了
否则实现的挺麻烦的
比如说你某个类要同时实现这三个接口
那么对于这三个接口中的相同方法
你要这样写:
IHeaderBll.GetListByWhere(string sAnd)
{}
IHeader2Bll.GetListByWhere(string sAnd)
{}
IDetailBll.GetListByWhere(string sAnd)
{}
mngzilin 2010-04-29
  • 打赏
  • 举报
回复
可以提成为一个接口
shixiujin 2010-04-29
  • 打赏
  • 举报
回复
@lz您好:
对于您提出的问题,我也不好回答.
只能等待高手给予您帮助了.
帮顶了...

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧