【问题标题】:Autofac - Reuse injected service in component to satisfy other componentsAutofac - 在组件中重用注入的服务以满足其他组件
【发布时间】:2011-05-25 20:01:05
【问题描述】:

使用 Autofac,假设我有一个 PersonRepository 和一个 EventRepository 类,它们都依赖于 IDataService 服务...我在 Mvc 控制器操作中使用这两个存储库类(例如 - 也可能是一些 MvvM WPF 应用程序) 喜欢

public class Mycontroller : controller
{
   public Mycontroller(PersonRepository personRepo, EventRepository eventRepo) {...}
   ...
   public ActionResult Index(){ ... I use the repository classes in here ...}
}
public class PersonRepository
{
   public PersonRepository(IDataService service){...}
}
public class EventRepository
{
   public PersonRepository(IDataService service){...}
}

我想确保在使用存储库类并使用 IDataService 实现注入它们时,两个存储库类都接收到相同的实例 IDataService 服务...

我该怎么做?

【问题讨论】:

    标签: c# autofac


    【解决方案1】:

    这取决于 IDataService 的生命周期。

    您想一遍又一遍地重复使用同一个吗?那么它基本上是一个单例,你必须配置 Autofac 将其视为一个:

    builder.RegisterType<IDataService>().As<MyDataService>().SingleInstance();
    

    但是,如果您在 MVC 中运行并且希望仅在 HTTP 请求的生命周期内重用同一个实例,您可以像这样配置 Autofac:

    builder.RegisterType<IDataService>().As<MyDataService>().HttpRequestScoped();
    

    【讨论】:

    • MVC 示例基本上是我想要的解决方案。但是,考虑到我没有 HTTP 请求,我想知道自己的解决方案是什么。 (例如在 MvvM WPF 应用程序中)
    • 在 WPF 应用程序中,它将是 Singleton。
    • 不完全是。使用单例,我将拥有一个用于整个应用程序的实例,而不是一个工作单元......不是吗?
    • 上面没有提到 IDataService 是一个工作单元。它听起来也不像是一个工作单元,它听起来像是一项服务。您的服务将是单例的,您的工作单元将在服务级别进行管理——也就是说,每个 C/U/D 操作都会创建一个工作单元。
    • 好吧,你是对的。感谢您一直以来的帮助。也许我虚构的例子不是最好的选择呵呵 :) 似乎工作单元确实是我想要的。但是,考虑到我希望避免在服务中使用 Autofac 代码,你是怎么做的呢? (nblumhardt.com/2011/01/an-autofac-lifetime-primer 在生命周期范围的帮助下解释了 autofac 的工作单元,但是代码被 .Resolve() 调用破坏了。我想纯粹通过注入来完成)
    【解决方案2】:

    注册组件时调用.SingleInstance()方法。 (假设注册流畅)

    【讨论】:

    • SingleInstance 本质上将创建一个单例注册。如果有人想根据某种逻辑有选择地将一个服务实例传递给一组消费者,然后将另一个实例传递给另一组消费者怎么办?
    • 然后你将实现一个工厂。
    【解决方案3】:

    尝试使用您的重用规则实现IComponentLifetime,并使用您的生命周期注册服务。

    【讨论】:

    • lifetimescope 确实是我得到的最接近的。但是在所有示例中(例如code.google.com/p/autofac/wiki/DeterministicDisposal),您的代码似乎被特定的 Autofac 代码(.Resolve() 调用)破坏了。整个 IoC 的目标不就是解耦一切吗? (因此,不要在您的代码中进行任何特定的 Autofac 调用,而是要注入所有内容)
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2016-02-10
    相关资源
    最近更新 更多