【问题标题】:How implement Strategy/Facade Pattern using Unity Dependecy Injection Web API如何使用 Unity 依赖注入 Web API 实现策略/外观模式
【发布时间】:2017-01-20 18:43:55
【问题描述】:

如何告诉 Unity.WebApi 依赖注入框架,在正确的控制器中注入正确的类?

DI 项目容器

public class UnityContainerConfig
{

    private static IUnityContainer _unityContainer = null;

    public static IUnityContainer Initialize()
    {
        if (_unityContainer == null)
        {
            _unityContainer = new Microsoft.Practices.Unity.UnityContainer()  
            .RegisterType<IMyInterface, MyClass1>("MyClass1")
            .RegisterType<IMyInterface, MyClass2>("MyClass2")
     }
}

-MVC 项目-

public static class UnityConfig
{
    public static void RegisterComponents()
    {            
        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(DependencyInjection.UnityContainer.UnityContainerConfig.Initialize());
    }
}

控制器 1:

 private IMyInterface _myInterface
 ///MyClass1
 public XController(
         IMyInterface myInterface
        )
    {
        _myInterface = myInterface
    }

控制器 2:

 private IMyInterface _myInterface
 ///MyClass2
 public YController(
         IMyInterface myInterface
        )
    {
        _myInterface = myInterface
    }

【问题讨论】:

  • 您的问题是关于策略和/或外观的,但根据您的问题尚不清楚它们中的任何一个如何有用。您是否尝试通过控制器对 IMyInterface 类型进行条件解析?
  • 换句话说,为什么要使用标准来选择每个控制器的IMyInterface 实现?也就是说,Unity 无法猜测。
  • @NightOwl888 是的,我正在尝试这样做。 “如果(XController)用于 IMyInterface MyClass1 如果(YController)用于 IMyInterface MyClass2”。我在stackoverflow上搜索,但到目前为止我没有找到任何答案。
  • 要使用策略模式,请参阅Dependency Injection Unity - Conditional resolving。也就是说,这看起来更像是一个设计问题 - 因为两个 IMyInterface 实例没有在同一个控制器中使用,您应该改为制作专用接口(@98​​7654329@ 和 public interface IYControllerMyInterface : IMyInterface {})并将每种类型注册到您的容器中,因为这里没有实际的运行时交换。
  • 我想我明白你的意思了。我还没有找到使用 Unity 解决这个问题的方法,这是我不使用它的一个原因。其他容器(例如 StructureMap 或 Autofac)允许您仅指定一个参数,其他容器保持默认值。但是,我的建议是不要在这种情况下使用策略模式,因为在这里使用它没有意义。你应该将你的接口设计成独一无二的(一种方法是IMyInterface&lt;EntityName&gt;,这样你就有了一个与控制器类型相匹配的接口类型)。

标签: c# asp.net-mvc design-patterns dependency-injection unity-container


【解决方案1】:

与其使用策略或外观来解决此问题,更好的解决方案是重新设计您的界面,使每个控制器都独一无二。一旦你有了一个独特的接口类型,你的 DI 容器就会自动将正确的服务注入到每个控制器中。

选项 1

使用通用接口。

public interface IMyInterface<T>
{
}

public class XController
{
    private readonly IMyInterface<XClass> myInterface;

    public XController(IMyInterface<XClass> myInterface)
    {
        this.myInterface = myInterface;
    }
}

public class YController
{
    private readonly IMyInterface<YClass> myInterface;

    public YController(IMyInterface<YClass> myInterface)
    {
        this.myInterface = myInterface;
    }
}

选项 2

使用接口继承。

public interface IMyInterface
{
}

public interface IXMyInterface : IMyInterface
{
}

public interface IYMyInterface : IMyInterface
{
}

public class XController
{
    private readonly IXMyInterface myInterface;

    public XController(IXMyInterface myInterface)
    {
        this.myInterface = myInterface;
    }
}

public class YController
{
    private readonly IYMyInterface myInterface;

    public YController(IYMyInterface myInterface)
    {
        this.myInterface = myInterface;
    }
}

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多