【发布时间】: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