没有为具有依赖性解析器的此对象定义的无参数构造函数

时间:2017-04-21 11:16:53

标签: dependency-injection unity-container dependency-resolver

我目前正在youtube上关注“asp net mvc 5教程中的Dependancy Injection”。 https://www.youtube.com/watch?v=27DQn6kZDFM

我跟他说,但我有这个错误。

No parameterless constructor defined for this object.

我的控制器是UnityDemoController

public class UnityDemoController : Controller
{

    private readonly ILocalWeaherServiceProvider _localWeaherServiceProvider;

    public UnityDemoController(ILocalWeaherServiceProvider localWeaherServiceProvider)
    {
        _localWeaherServiceProvider = localWeaherServiceProvider;

    }

    //
    // GET: /UnityDemo/

    public ActionResult Index()
    {


        string currentWeatherInMyArea = _localWeaherServiceProvider.GetLocalWeatherByZipCode("0006");

        return View();
    }

}

IocConfiguration.cs 此配置位于App_Start文件夹下

public static class IocConfiguration
{
    public static void ConfigureIocUnityContaioner()
    {
        IUnityContainer container = new UnityContainer();

        RegisterServices(container);

        DependencyResolver.SetResolver(new MyUnityDependancyResolver(container));
    }

    private static void RegisterServices(IUnityContainer container)
    {
        container.RegisterType<ILocalWeaherServiceProvider, LocalWeatherServiceProvider>(); // This means when somebody call/need ILocalWeaherServiceProvider then provide new Instance of the LocalWeatherServiceProvider


    }
}

MyUnityDependancyResolver.cs

public  class MyUnityDependancyResolver : IDependencyResolver
{
    private IUnityContainer _unityContainer;

    public MyUnityDependancyResolver(IUnityContainer unityContainer)
    {
        _unityContainer = unityContainer;
    }


    public object GetService(Type serviceType)
    {
        try
        {
            return _unityContainer.Resolve(serviceType);
        }
        catch (Exception)
        {

            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return _unityContainer.ResolveAll(serviceType);
        }
        catch (Exception)
        {

            return new List<object>();
        }
    }
}

界面 ILocalWeaherServiceProvider

public interface ILocalWeaherServiceProvider
{
    string GetLocalWeatherByZipCode(string zipcode);
}

服务类 LocalWeatherServiceProvider

public class LocalWeatherServiceProvider : ILocalWeaherServiceProvider
{
    public string GetLocalWeatherByZipCode(string zipcode)
    {
        return "Its is snowing right now in your Area : " + zipcode;
    }
}

我添加了Unity。

谁能告诉我这里出了什么问题? 并且避免这些错误我应该在这些编码级别中查看哪些内容?

1 个答案:

答案 0 :(得分:0)

我通过参考以下链接找到了解决方案。

https://cuttingedge.it/blogs/steven/pivot/entry.php?id=97

按如下所示更改UnityDemoController类。

public class UnityDemoController : Controller
{

    private readonly ILocalWeaherServiceProvider _localWeaherServiceProvider;

    public UnityDemoController() : this(new LocalWeatherServiceProvider())
    {

    }

    public UnityDemoController(ILocalWeaherServiceProvider localWeaherServiceProvider)
    {
        _localWeaherServiceProvider = localWeaherServiceProvider;
    }

    //
    // GET: /UnityDemo/

    public ActionResult Index()
    {
        string currentWeatherInMyArea = _localWeaherServiceProvider.GetLocalWeatherByZipCode("0006");

        return View();
    }

}