【问题标题】:Unity resolve using type from derived classUnity 使用派生类中的类型解析
【发布时间】:2015-02-02 15:57:45
【问题描述】:

我正在尝试设置一个结构,其中我有两组实现公共接口的派生类(模型和视图),并且我想使用 Unity 允许我从模型实例创建/解析视图。例如,

public interface ICommonA {}

public class ModelA : ICommonA {}
public class ViewA : ICommonA {}

public static void Main() {
    // Setup Unity container - register ICommonA to resolve ViewA objects
    var container = new UnityContainer();
    container.RegisterType<ICommonA, ViewA>();

    // At some point, we begin with a ModelA object.
    ModelA m = new ModelA();

    // Then, I want to automate the creation of ViewX objects from ModelX objects 
    // (I will have many such pairs) without checking exactly which type of model 
    // I currently have.
    var v = container.Resolve(m.GetType(), String.Empty);

    // Do something with v now.
}

我遇到的问题是我不能简单地要求 Unity 从模型类型 (ModelA) 中解析,它似乎不会自动扫描类型的接口并找到已注册的接口。我知道我可以通过显式检查每个传入模型类型并使用container.Resolve&lt;ICommonA&gt;(String.Emtpy) 准确解析我需要的接口来解析视图,但我希望有一个更通用的解析步骤,允许我添加更多模型/视图类型而无需更新我的分辨率代码以检查新的模型类型。

这在 Unity 中可行吗?

【问题讨论】:

    标签: c# inversion-of-control unity-container


    【解决方案1】:

    不知何故,您的“模型”需要提供有关使用哪种视图类型的信息。几个可能的选项是直接指定类型或为已知接口的命名注册指定名称:

    有类型(假设model.GetViewType()返回typeof(ViewA)

     var view = container.Resolve(model.GetViewType(), String.Empty);     
    

    使用命名注册(假设model.GetViewRegistrationName() 返回“SomeName”)

     container.RegisterType<ICommonA, ViewA>("SomeName");
     var view = container.Resolve(typeof(ICommonA), 
       model.GetViewRegistrationName());
    

    【讨论】:

    • 谢谢。我喜欢您存储关联视图类型的想法。我将使用我设置的字典来实现它,以将模型类型映射到关联的视图类型,但本质上是你的第一个想法。
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多