使用工厂解决依赖关系

时间:2016-03-12 10:34:15

标签: c# dependency-injection autofac rebus

我们有一个带autofac的webolution。现在,我们希望在Windows服务/控制台应用程序中重用一些东西,只有当消息从企业总线传入时才能使用。

我有以下服务可以重复使用

public SettingsService : ISettingsService {
    public readonly ITenantIdentifer _tenantIdentifier
    public SettingsService (ITenantIdentifier tenantIdentifier) {
       this._tenantIdentifier =tenantIdentifier; 
    }
    // do other stuff
}

当前的工作设置

只需使用ITenantIdentifier为web应用注册webcontext的builder.RegisterType<WebTenantIdentifier>().As<ITenantIdentifier>();
Evething工作正常。

我们的企业巴士

在消息可用之前,企业总线无法解析ITenantIdentifier。所以我们创建了一个MessageTenantIdentifier并注册了一个工厂。

 public class MessageTenantIdentifier : ITenantIdentifier
 {
    public delegate MessageTenantIdentifier Factory(int tenantId);
public MessageTenantIdentifier(int tenantId, IOtherDependency stuff)
    {
        _tenantId = tenantId;
        // ...
    }
}

// somewhere else the this is registered     
builder.RegisterType<MessageTenantIdentifier >().As<ITenantIdentifier>().AsSelf();
builder.RegisterGeneratedFactory<MessageTenantIdentifier.Factory>();

问题 工厂只能在

中处理消息时使用
public class MsgTypeHandler : IHandleMessages<MsgType>
{
    public MsgTypeHandler(ISettingsService settingsService, MessageTenantIdentifier factory) { ...}
    public async Task Handle(MsgType message)
    {
        var tenantId = message.TenantId;
        // THIS IS THE MOMENT I CAN CONFIGURE THE MessageTenantIdentifier
        var tenantIdentifier = factory.Invoke(tenantId);

        // but this factory is not used against the ISettingsService.  The service to be reused.  <== THE REAL PROBLEM
    }
}

问题

那么,我该如何解决这个问题呢?例如。我应该如何在servicebus中设置MessageTenantIdentifier的注册? 或者我的依赖设置是否完全错误?

1 个答案:

答案 0 :(得分:2)

如果MsgTypeHandler类需要ISettingsService,但在租户ID可用之前无法解析整个对象图,则表示MsgTypeHandler是{{3} }}。没关系,但这意味着你可以解决整个对象图,所以不要在这里注入个别服务;相反,注入你需要的工厂:

public class MsgTypeHandler : IHandleMessages<MsgType>
{
    public MsgTypeHandler(ISettingsServiceFactory factory) {...}

    public async Task Handle(MsgType message)
    {
        var tenantId = message.TenantId;
        ISettingsService svc = this.factory.Create(tenantId);

        // User svc here...
    }
}
相关问题