如何注册使用Simple Injector接口的具体对象?

时间:2017-03-23 13:32:02

标签: c# dependency-injection simple-injector

在以下代码中,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();
    }
}

1 个答案:

答案 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: