在以下代码中,HomeController
收到ValueObject
,其状态someValue
在数据库中经常更改。在构造函数中检索状态。
如何使用HomeController
在容器中注册IHomeController
,因此每当访问HomeController
时,都会创建一个新的ValueObject
,并将其状态更新为好?
public class HomeController()
{
public HomeController(ValueObject value)
{
}
}
public class ValueObject()
{
public someValues { get; private set; }
public ValueObject(IValueRepository repository)
{
// The someValue changes very often in the system
someValue = repository.GetSomeValues();
}
}
答案 0 :(得分:2)
这应该有效:
ValueObject
从DI的角度来看,你的SomeValues
很麻烦,因为它在构造函数中调用了它的依赖项。但是,注入构造函数should be simple and reliable。
因此,如果您打算缓存public class CachingValueRepositoryDecorator : IValueRepository
{
private readonly Lazy<SomeValues> values;
public CachingValueRepositoryDecorator(IValueRepository decoratee)
{
this.values = new Lazy<SomeValues>(decoratee.GetSomeValues);
}
public SomeValues GetSomeValues() => this.values.Value;
}
,更好的设计是使用装饰器。例如
ValueObject
此类装饰工具可让您无需在HomeController
中使用public class HomeController
{
public HomeController(IValueRepository repository)
{
}
}
,只需如下所示:
container.Register<HomeController>();
container.Register<IValueRepository, SqlValueRepository>();
container.RegisterDecorator<IValueRepository, CachingValueRepositoryDecorator>();
这可以注册如下:
resolve: