【问题标题】:Can autofac do partial Resolve?autofac 可以做部分解析吗?
【发布时间】:2011-09-10 01:08:17
【问题描述】:

我似乎非常需要这个。

假设我有一个类,其构造函数带有多个参数。其中一些可以通过注册组件来解决。但其余的是在运行时创建的实例(例如,从数据库中获取实体)。

Autofac 可以很好地处理这些情况吗?还是我的设计欠佳?

为了澄清,我的类有这样的构造函数:

public MyClass(IService1 service1, IService2 service2, Data1 data1, Data2 data2)
{
//...
}

我想做这样的事情:

container.Resolve<MyClass>(data1, data2);

【问题讨论】:

标签: ioc-container partial autofac resolve


【解决方案1】:

您可以通过在 Autofac 容器中注册 factory method 来优雅地处理这个问题。您解析工厂方法,然后使用它来创建具有运行时依赖项的实例。您可以通过注册和解析委托或自定义工厂类型来自己完成此操作。但是,Autofac has explicit support for delegate factories

没有足够的信息来评论您的设计。我会把它留给你:)

【讨论】:

    【解决方案2】:

    我会说你的设计是次优的。

    你似乎混在了一起。依赖注入(使用容器)应该主要用于将服务组件注入到其他组件中。不要注入实体之类的东西,因为容器不能管理它们的生命周期。相反,注入可以为您管理实体的服务,例如repository。虽然是讨论话题,但我不会注入一个工作单元,而是注入一个factory for creating unit of works。通过这种方式,您的应用程序可以显式管理工作单元的生命周期。

    【讨论】:

    • 我没有注入实体。我只有需要服务的类,还有具体的数据实例。
    • 在这种情况下尝试分离数据和行为。不要使用构造函数注入将数据对象 (DTO) 注入到服务中,也不要将服务注入到 DTO 中。只需从服务返回 DTO 或使用 DTO 调用服务方法。
    • 那么您建议类是服务还是数据对象?
    • 正如我所说,你应该注入一个工作单元还是一个存储库是讨论的话题。我两年前写了这个答案,从那以后改变了主意。对于我现在构建的应用程序,我发现直接注入一个工作单元更方便,正如我在this stackoverflow answer 中所表达的那样。
    • 感谢您修改答案。我应该注意,当我发布这个问题时,我正在处理一个有状态的 WPF 应用程序,这不是一个从 IoC 开始的好地方,因为在运行时有很多对象创建来响应用户操作。最后,我使用BeginLifeTimeScope 的重载来处理它,这需要额外的配置。我有 3 或 4 个嵌套范围,它们根据需要配置了额外的服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多