我目前正在开发一个基于组件的小型框架,即Android平台。该框架有一些可供使用的组件和一些抽象组件(有一些内部逻辑,但开发人员需要添加一些代码以使其充分发挥功能)。所有组件之间的通信都是通过接口满足的。我的问题是:
我有一个“需要”B组件的A组件。起初,我想到了两个解决方案:
在第二种解决方案中,开发人员还可以创建一个新组件,它尊重与A组件的约定(接口),然后使用它。
这些解决方案中的哪一个将导致框架和开发人员代码的更好的维护、灵活性和扩展?我接受其他解决办法。
发布于 2015-08-14 09:29:32
如果您正在创建一个框架,灵活性是关键。大多数框架提供接口和默认实现以及连接到缺省值的空构造函数,但允许您通过传递自己的实现或传递框架提供的替代实现来覆盖行为。
public interface IReader { string Read(); }
public interface IWriter { void Write(String str); }
public class DefaultReader: IReader
{
public string Read()
{
File.ReadAll("c:\myfile.cnf");
}
}
public class DefaultWriter: IWriter
{
public void Write(String str)
{
File.Write("c:\myfile.cnf", str);
}
}
public class MyFrameWorkClass
{
private IReader reader;
private IWriter writer;
public MyFrameWorkClass():
this(new DefaultReader(), new DefaultWriter())
{
}
public MyFrameWorkClass(IReader reader, IWriter writer)
{
this.reader = reader;
this.writer = writer;
}
}
框架以这种方式工作的原因很简单:它们不能提供任何DI,因为这内在地将它们与DI框架联系在一起。他们唯一能做的(而且应该做的)就是提供可以很容易地被DI处理的类。如果您要获得最终的灵活性,那么上面的代码也有可以分配的公共属性。这样,任何DI框架都可以插入并使用基于构造函数或基于属性的注入。
如果您想为您的对象提供大量的直截了当的DI,您将需要为您的框架创建单独的组件来进行绑定。例如,如果我在DI中使用Castle,我会提供一个可以插入的安装程序类。
https://softwareengineering.stackexchange.com/questions/293658
复制相似问题