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

标签 c# singleton mef

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

相关文章:

java - 单例和同步Servlet

c# - 如何自动构建 MEF 模块?

.net - 为什么我的 MEF 部分对插件主机不可见?

c# - 我有一个 asp.net c# 项目,<%=myfunction(); 之间有什么区别? %> & <%# myfunction() %>?

c# - 查找两个列表交集的高效数据结构

java - Singleton 在 Spring 中是如何工作的?

c# - 在服务器上托管时出现 MEF 异常

c# - 如何从 View 组件返回 JSON?

c# - Identity Server 4 混合流错误与客户端 key

c# - 给定单例缓存模式的缺点