我正在从事一个 MEF 项目,以发现使用和实现技术。我发现的第一个阶段是实现一个动态可配置的集中式数据 Controller 。自定义行为的一种方法是继承我提供的执行奇点规则的类。虽然单例模式在使用中饱受诟病,但我可能已经找到了一种实现,可以在某种程度上验证该模式存在的困难。
现状
假设 Host 导入的数据控制模块 (DataController) 旨在根据同级模块的请求向数据库提供公共(public)管道。我只需要一个 DataController 并组成一个模块,DataController 必须实现 IDataController。 DataProvider 作为基类的实现完全是可选的;但是,从 DataProvider 派生将需要一些额外的处理。
观察
收集事实:
静态类不能实现或 扩展抽象类或 接口(interface)。仅此事实 消除了静态类的使用 确保一个单一的存在 数据 Controller 。
实现 单例模式将确保 每个应用程序的单一存在 领域。没有限制 数据 Controller ;允许继承 需要导入的接口(interface)和 在主机中组成。
鉴于 DataController 的派生, 的标准实现 单例模式可能被证明是 在相同的情况下具有挑战性。这 提议的数据库同时提供 可公开访问的类: IDataController 和一个抽象 数据提供者。为确保单 派生 DataController 的实例, 实现将需要一些 偏离规范。
解决方案
此时,解决方案似乎很明确。 DataHandler 基类对 Singleton 模式的实现。我还没有天真到认为有其他方法可以做到这一点。但这是我对如何实现该模式的粗略期望:
// DataLibrary referenced by Host
public interface IDataController
{
IDataController Start();
DbConnection CreateConnection<TDbConnection>(params string[] args)
where TDbConnection : DbConnection, IDbConnection;
}
public abstract class DataProvider
{
// singleton implementation
private static IDataController dcInstance;
protected static IDataController Instance
{
get{ return dcInstance; }
}
// ========================
abstract IDataController CreateController();
protected IDataController instanceController<TDataController>()
where TDataController : IDataController, new()
{
return new TDataController ();
}
}
// references DataLibrary
[Export(typeof(IDataController))]
public class DataController : DataProvider, IDataController
{
public IDataController Start()
{
return CreateController();
}
protected override IDataController CreateController()
{
return instanceController<DataController>();
}
public SqlConnection CreateConnection(params string[] args)
{
// instance and return new SqlConnection
}
}
请记住,我一直在解决这个问题 - 阅读、理论化 - 但尚未完成实现。当我调试任何问题时,很可能会有一些更新。
显然,只有当 DataController 模块继承了抽象基类 DataProvider 时,才强制执行此实现。因此,如果开发人员选择从 DataProvider 派生 DataController,我们理所当然地应该执行单一性规则以避免滥用或误用。
综上所述,我很好奇是否有比我设计的更容易接受或更实用的实现。而且,我开始怀疑单例模式是否是正确的选择。由于 Singleton 模式的存在备受诟病(而且,在大多数情况下,这是理所当然的),因此我应该质疑我的选择。
是否有更实用的实现方式可以满足我的要求? *在这种情况下,这是单例模式的正确实现吗?* 此实现是否真的为模式的存在带来任何值(value)?
最佳答案
如果你想强制容器中只存在一个类的实例,那么你可以设置“共享”部分创建策略:
[Export(typeof(IDataController))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class DataController : IDataController
{
...
}
导入 IDataController
的每个部分将收到相同的实例。请注意,如果您在导入或导出端未指定任何部件创建策略,这已经是 MEF 中的默认行为。
你不应该将“单例”构建到一个类中。是否是单例是组件元数据或容器配置的一部分。其他依赖注入(inject)容器遵循相同的方法。例如,在 autofac 中,您将某些东西声明为像这样的单例:
builder.Register(c => new DataController())
.As<IDataController>().SingleInstance();
关于c# - MEF 是否赋予单例模式任何值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484619/