【问题标题】:Implementing a generic service factory or provider in Autofac在 Autofac 中实现通用服务工厂或提供者
【发布时间】:2011-04-15 11:41:48
【问题描述】:

我有一个接口,例如ISomeService。 ISomeService 提供通用服务,但实现可能会有所不同。因此,它们将具有不同的依赖关系。

考虑:

interface ISomeService
{
     void DoSomething();
}

class SomeServiceA : ISomeService
{
     public SomeServiceA(DependencyOne one, DependencyTwo two)
     {
     }


     public void DoSomething()
     {
     }
}

class SomeServiceB : ISomeService
{
     public SomeServiceB(DependencyThree three)
     {
     }

     public void DoSomething()
     {
     }
}

现在,现实情况是我不能只是将 ISomeService 的依赖项添加到我的控制器并完成它。我需要根据用户告诉我的内容选择 IService 的实现,并且我可能必须创建他们选择的服务的多个副本。

也许我有一个类,可以让我按类型解析我需要的 ISomeService 实例:

class SomeServiceProvider
{
    public T Get<T>()
        where T : ISomeService
    {
          // uh oh, this is starting to have a bad smell... do I call the container? that's no good
    }

}

所以我可以

class SomeController
{
     SomeServiceProvider ServiceProvider { get; set; }

     public SomeController(ServiceProvider provider)
     { ServiceProvider = provider; }

     public void SomeAction(string serviceName)
     {
          ISomeService someService;
          if (serviceName.Equals('SomeServiceA')) someService = ServiceProvider.Get<SomeServiceA>();
          else someService = ServiceProvider.Get<SomeServiceB>();
          someService.DoSomething();
     }

}

Autofac 的委托工厂似乎不适合这里,我不知道该怎么做(除了使用服务定位器)。有什么建议吗?

【问题讨论】:

    标签: c# dependency-injection factory provider autofac


    【解决方案1】:

    这是你需要的吗? Service types, names and keys

    可以使用服务名称进一步识别服务。使用这种技术,Named() 注册方法替换了 As()。

    builder.Register<OnlineState>().Named<IDeviceState>("online");
    

    要检索命名服务, 使用了 ResolveNamed() 方法:

    var r = container.ResolveNamed<IDeviceState>("online");
    

    【讨论】:

    • 我认为链接中的 Resolving an Index 部分可以满足我的要求,尽管我必须编写一个需要引用 Autofac 本身的组件有点尴尬.但是,我想我可以应付。谢谢!
    • 我建议创建一个使用 IIndex 并实现 ISomethingFactory 的 SomethingFactory,然后您可以在控制器中使用它 - 两全其美! :) 像 IIndex 这样的类型最好保留在应用程序的基础设施部分——它与 IoC 容器交互的地方——而不是常规的应用程序组件。祝你好运!尼克
    猜你喜欢
    • 2015-07-22
    • 2014-03-03
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2015-10-15
    相关资源
    最近更新 更多