单例、静态和 IoC

Singleton, Static and IoC

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

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

不过,我用的是IoC,觉得这里有冲突。我使用 Unity 作为我的 IoC 容器。我通过添加静态实例和处理实例的 public 实例开始转换。

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

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);

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

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

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