【问题标题】:Singleton, Static and IoC单例、静态和 IoC
【发布时间】:2017-03-27 03:06:07
【问题描述】:

我正在尝试将我的参考数据服务层更改为静态实现,并应用单例模式。原因是,我认为参考服务可以是静态的以提高性能(全部共享相同的“实例” - 我认为?)

我有一个分层的应用程序。 UI->服务->逻辑->数据

但是,我使用 IoC,并认为这里存在冲突。我使用 Unity 作为我的 IoC 容器。我通过添加一个静态实例和一个处理该实例的公共实例来开始转换。

但是,我不确定如何处理我的构造函数。我(Unity)目前将我的参考数据逻辑类注入到构造函数中......

public class ReferenceDataService : IReferenceDataService
{

    private static ReferenceDataService instance;

    IReferenceDataLogic _refDataLogic;
    ObjectCache cache = MemoryCache.Default;

    public ReferenceDataService(IReferenceDataLogic logic)
    {
        _refDataLogic = logic;
    }

    public static ReferenceDataService Instance {

        get
        {
            if(instance != null) return instance;
            lock(new object())
            {
                instance = new ReferenceDataService();
            }
            result instance;
        }
    }
}

但我认为我需要删除此构造函数,以便在我的 UI 代码中,我可以获取数据但说:

var MyReferenceDataList = ReferenceDataService.Instance.GetMyReferenceDataList(type);

我还需要将逻辑和数据访问层类设为静态吗?这意味着我永远无法真正对此进行单元测试。

【问题讨论】:

  • 你需要做这些吗?你不能使用你原来的实现,只告诉 unity 创建一个实例吗?
  • 我不确定,@Fran - 我会调查一下。
  • 看来你在这里教育了我。在我的 Unity 容器中,我可以简单地这样做: myContainer.RegisterType(new ContainerControlledLifetimeManager()); - 这意味着该类将被视为单例?我猜我需要更改服务层类、逻辑和数据库类?
  • 你应该更喜欢这样做而不是使用单例模式,因为这种模式使测试复杂化并且不允许你的类被轻易拦截或修饰。此外,您的锁定模型完全有缺陷。以这种方式配置时,Unity(或任何容器)将确保最多创建一个实例。
  • 同意@Steven。只需在ContainerControlledLifetimeManager 注册您的课程,不要更改任何其他内容!

标签: c# inversion-of-control unity-container


【解决方案1】:

您应该能够告诉您的容器返回一个实例。我对 Unity 不熟悉,但在 Castle Windsor 中,您只需将生活方式设置为单身

container.Register(Classes.FromThisAssembly()
   .BasedOn(typeof(IProvideWellKnownData))
   .WithServiceAllInterfaces()
   .LifestyleSingleton());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多