【问题标题】:Unity Dependency could not be resolved on Model class无法在模型类上解决 Unity 依赖关系
【发布时间】:2017-04-16 08:59:54
【问题描述】:

我正在学习 Unity,并创建了一个非常简单的 web api 解决方案。

public interface IClass1
    {
        string GetItem();
    }

    public class Class1 : IClass1
    {
        public string GetItem() {
            return "hello";
        }
    }

然后我使用 Unity 做 IoC 工作,例如:

var container = new UnityContainer();
container.RegisterInstance<IClass1>(new Class1());

GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

如果我想获得对控制器的依赖,上面的代码可以正常工作

[Dependency]
public IClass1 Class1Instance { get; set; }

[HttpGet]
[Route("Hello")]
public IHttpActionResult PutData()
{
    return Ok(Class1Instance.GetItem());
}

但如果我尝试在 Model 类(即 Base 类)上做同样的工作......我无法解决......

public class Base
{
    [Dependency]
    public IClass1 ClassInstance { get; set; }

    public string Name { get; set; }

    public string GetVal()
    {
        return ClassInstance.GetItem(); // ClassInstance is null
    }
}

我对此一无所知....也许问题出在 jsonConverter....

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JObject jobject = new JObject();
            object target;

            if (jobject.Property("Name") != null)
                target = new Base(); // Here is the problem root cause ??

            serializer.Populate(jobject.CreateReader(), target);
            return target;
        }

如果我想解决对 Model 类的依赖,如何解决我的问题??

谢谢!

【问题讨论】:

  • 为什么你认为它与jsonconverter有关?
  • 我只是猜测,我只是不知道为什么我无法解决对 Model 类的依赖
  • 延伸@CodingYoshi的问题,你为什么认为是jsonConverter?您是否遇到与解析 jsonConverter 相关的异常?您能否向我们提供任何可能有助于缩小问题范围的异常详细信息?
  • @ninjacoder no.... jsonConverter 也不例外....我只是随机猜测根本原因....
  • @allencharp 将解析器传递给自定义转换器。将 Base 类注册到要根据请求解析的容器。让解析器解析基类并注入依赖项。

标签: c# asp.net-mvc asp.net-web-api dependency-injection unity-container


【解决方案1】:

根据我对您问题的理解,我认为您的解决方案中缺少的链接是controller。设置DependencyResolver 确实是必需的步骤。在不知道UnityDependencyResolver 的代码的情况下,我会假设该部分是正确的。您提供的代码中缺少的是“控制器”类。创建它,例如:

public class TestController : ApiController
{
    [RoutePrefix("api/Whatever")]
    public TestController(IClass1 class1)
    {
        // At this point, your class1 will have been
        // instantiated by Unity.
    }

    [HttpGet]
    [Route("EvenMore")]
    public HttpResponseMessage EvenMore(string foo)
    {
    }
}

这样做,在构造函数中放置一个断点,然后调用 EvenMore。如果它不起作用,请使用您可能拥有的任何其他信息更新您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2016-02-16
    • 2017-02-20
    相关资源
    最近更新 更多