【发布时间】:2016-01-31 02:34:59
【问题描述】:
我想设计一个由几个松散耦合的组件组成的内部框架。
在一本书中,我发现建议更喜欢通过具体类实现多个接口,而不是构建接口树。
数据访问接口(系列)示例:
我的做法:
interface ISession : IDisposable
{
void OpenSession();
void CloseSession();
}
interface IDataAccess: ISession
{
void SetData(string data);
string GetData();
}
class MyTextFileAccess : IDataAccess
{
// no-op Open, Close, Dispose
}
class SQLDataAccess : IDataAccess
{
// all interface methods are really needed
}
这本书似乎偏爱的方法可能是这样的:
interface ISession
{
void OpenSession();
void CloseSession();
}
interface IDataAccess
{
void SetData(string data);
string GetData();
}
class MyTextFileAccess : IDataAccess
{
// don't have to implement unused interface methods
}
class SQLDataAccess : IDataAccess, IDisposable, ISession
{
// same as above
}
接口的使用也会有所不同:
void UseMyWay(IDataAccess da) // IDataAccess inherits from ISession and IDisposable
{
da.OpenSession();
da.GetData();
da.SetData("");
da.CloseSession();
da.Dispose();
}
void UseTheBooksWay(IDataAccess da) // IDataAccess doesn't inherit from ISession and IDisposable
{
var da_session = da as ISession;
var da_disposable = da as IDisposable;
if (da_session != null)
da_session.OpenSession();
da.GetData();
da.SetData("");
if (da_session != null)
da_session.CloseSession();
if (da_disposable != null)
da_disposable.Dispose();
}
我更喜欢我的方法中的用法,因为它是统一的,用户不必考虑测试多个接口(仅通过查看IDataAccess 并不明显),因此不能忘记这样做.
但我也更喜欢简洁的界面,专门用于书籍中使用的一个主题;这还有一个好处是我不必实现显然不需要的接口(文本文件访问)。
我的方法中的“最终”接口需要了解所有看起来不正确的实现,因为接口不应该依赖于实现细节。如果我想添加一个需要首先进行身份验证的新 SecureDataAccess 实现,这可能是个问题。
有没有办法将这两种优势结合起来,或者你有其他方法吗?
【问题讨论】:
标签: c# interface components