无法在Model类上解析Unity依赖关系

时间:2017-04-15 14:43:27

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

我正在学习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);

如果我想获得对Controller

的依赖,上面的代码工作正常
[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类的解析依赖性,如何解决我的问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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。如果它不起作用,请使用您可能拥有的任何其他信息更新您的问题。