单例,静态和IoC

时间:2017-03-27 03:06:07

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

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

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

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

但是,我不知道如何处理我的构造函数。我(Unity)目前将我的Reference数据逻辑类注入构造函数...

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

我是否还需要使逻辑和数据访问层类也是静态的?这意味着我永远无法对此进行单元测试。

1 个答案:

答案 0 :(得分:1)

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

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