Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何注册使用Simple Injector接口的具体对象?_C#_Dependency Injection_Simple Injector - Fatal编程技术网

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

C# 如何注册使用Simple Injector接口的具体对象?,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,在以下代码中,HomeController接收一个ValueObject,其状态someValue在数据库中经常更改。在构造函数中检索状态 如何使用IHomeController在容器中注册HomeController,以便在访问HomeController时,创建新的ValueObject,并更新其状态 public class HomeController() { public HomeController(ValueObject value) { } } publ

在以下代码中,
HomeController
接收一个
ValueObject
,其状态
someValue
在数据库中经常更改。在构造函数中检索状态

如何使用
IHomeController
在容器中注册
HomeController
,以便在访问
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();
    }
}
这应该起作用:

container.Register<HomeController>();
container.Register<ValueObject>();
container.Register<IValueRepository, SqlValueRepository>();
这样的装饰器允许您在
HomeController
中不再需要
ValueObject
,其外观如下所示:

public class HomeController
{
    public HomeController(IValueRepository repository)
    {
    }
}
container.Register<HomeController>();
container.Register<IValueRepository, SqlValueRepository>();
container.RegisterDecorator<IValueRepository, CachingValueRepositoryDecorator>();
可按以下方式进行注册:

public class HomeController
{
    public HomeController(IValueRepository repository)
    {
    }
}
container.Register<HomeController>();
container.Register<IValueRepository, SqlValueRepository>();
container.RegisterDecorator<IValueRepository, CachingValueRepositoryDecorator>();
container.Register();
container.Register();
container.RegisterDecorator();
这应该可以:

container.Register<HomeController>();
container.Register<ValueObject>();
container.Register<IValueRepository, SqlValueRepository>();
这样的装饰器允许您在
HomeController
中不再需要
ValueObject
,其外观如下所示:

public class HomeController
{
    public HomeController(IValueRepository repository)
    {
    }
}
container.Register<HomeController>();
container.Register<IValueRepository, SqlValueRepository>();
container.RegisterDecorator<IValueRepository, CachingValueRepositoryDecorator>();
可按以下方式进行注册:

public class HomeController
{
    public HomeController(IValueRepository repository)
    {
    }
}
container.Register<HomeController>();
container.Register<IValueRepository, SqlValueRepository>();
container.RegisterDecorator<IValueRepository, CachingValueRepositoryDecorator>();
container.Register();
container.Register();
container.RegisterDecorator();

更新您的示例。代码段不反映问题的内容。您不需要
IHomeController
。您需要使用适当的DI容器,并使用生存期
PerRequest
注册
ValueObject
ValueRepository
。这将为每个请求创建它们的新实例,对它们执行方法将为每个请求获得新状态。我还建议让HomeController依赖于存储库,并让存储库返回
ValueObject
的对象。更新您的示例。代码段不反映问题的内容。您不需要
IHomeController
。您需要使用适当的DI容器,并使用生存期
PerRequest
注册
ValueObject
ValueRepository
。这将为每个请求创建它们的新实例,对它们执行方法将为每个请求获得新状态。我还建议HomeController依赖于存储库,并让存储库返回
ValueObject
的对象。