【问题标题】:Autofac resolve class by specified constructorAutofac 通过指定的构造函数解析类
【发布时间】:2017-05-11 15:11:48
【问题描述】:

我有以下课程:

public abstract class UserTaskChangesObserver : IObserver
{
    protected readonly IUserTaskChangesObservable UserTaskChangesObservable;
    protected readonly IUserAccountChangesObservable UserAccountChangesObservable;

    protected UserTaskChangesObserver(IUserTaskChangesObservable userTaskChangesObservable)
    {
        if (userTaskChangesObservable == null)
        {
            throw new ArgumentNullException(nameof(userTaskChangesObservable));
        }
        UserTaskChangesObservable = userTaskChangesObservable;
    }

    protected UserTaskChangesObserver(IUserAccountChangesObservable userAccountChangesObservable)
    {
        if (userAccountChangesObservable == null)
        {
            throw new ArgumentNullException(nameof(userAccountChangesObservable));
        }
        UserAccountChangesObservable = userAccountChangesObservable;
    }

    protected abstract void OnUserTaskChange(object sender, UserTaskEventArgs userTaskEventArgs);
    protected abstract void OnUserAccountChange(object sender, UserAccountEventArgs userTaskEventArgs);
}

在从上下文中解析我的RealClass 时,是否可以说 autofac 我想使用哪个构造函数? 例如对于当前服务我想调用第一个构造函数:

builder.RegisterType<UserTaskService>().AsSelf().As<IUserTaskChangesObservable>()
     .OnActivated(args =>args.Context.Resolve<UserTaskChangesObserver>().Subscribe()).InstancePerLifetimeScope();

【问题讨论】:

  • 为什么你会有不同的构造函数,在我看来就像设计的味道。
  • 你觉得如果我再创建一个抽象的观察者会更好吗?
  • 两个不同的构造函数清楚地表明类做的比它应该做的更多,处理UserTask和处理UserAccount。我认为将这些分开会更好。这也将解决您的Autofac 问题。
  • 我之所以选择这样的设计,是因为UserAccount 的一些修改需要UserTask 更改。指定,如果UserAccount 属性已更改,我需要重新计算一些UserTask 字段。
  • 有多个构造函数是an anti-pattern

标签: c# dependency-injection autofac


【解决方案1】:

拥有两个构造函数甚至不是设计的味道,正如@Lepijohnny 指出的那样,它是一种反模式This article 详细解释了为什么这是一种反模式以及如何防止这种情况。

在您的情况下,您的班级似乎有两个职责。解决方案是将其拆分为两个单独的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多