gpt4 book ai didi

c# - MEF 是否赋予单例模式任何值(value)?

转载 作者:太空狗 更新时间:2023-10-29 22:08:40 25 4
gpt4 key购买 nike

我正在从事一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com