在手动创建的对象上注入行为

时间:2012-04-06 16:27:04

标签: inversion-of-control autofac

我正在使用autofac。到目前为止,我使用构造函数注入来解析所有依赖项。

有一种情况我卡住了:

考虑给定的客户类别:

public class Customer : ICustomer
{
    public string Name { get; set; }

    private int ExternId { get; set; }

    public IExternalIdProvider externalIdProvider { get; set; }

    public Customer()
    {
            this.externalIdProvider = new ConcreteIdProvider(this);
    }

    public BevorSave()
    {
        this.ExternId = externalIdProvider.GetNextId();
    }
}

为了根据请求或gui操作创建新的客户对象。我使用新的运营商。但是 - 我想要注入的CustomerClass中有一个IdProvider。 (作为财产)。

如果客户将通过ioC Container解决,我将使用如下配置:

builder.RegisterType<ConcreteIdProvider>().As<IExternalIdProvider>();
builder.RegisterType<Customer>().As<ICustomer>()
       .OnActivated(ae =>
            {
              IExternalIdProvider idProvider = 
                ae.Context.Resolve<IExternalIdProvider>(TypedParameter.From(ae.Instance));
              ae.Instance.externalIdProvider = idProvider;
            });

我的问题是:如何在客户中注入ExternalIdProvider的行为? (使用autofac)

本文展示了一个示例,如何使用服务定位器完成此操作: http://blogs.msdn.com/b/simonince/archive/2008/06/30/dependency-injection-is-dead.aspx

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您应该重新考虑在您的实体上行为。在你的实体中有行为迫使你对它们进行依赖注入,这会导致你已经注意到的尴尬局面。看看this related SO question and Mark Seemann's great answer

因此,不要在Customer类上进行这些操作,而是将它们移到repository类。要查看的其他模式包括unit of workcommandsqueries