如何使用Microsoft Asp.net WebApi创建依赖注入

时间:2016-11-30 20:58:30

标签: c# dependency-injection asp.net-web-api2

我在使用Xamarin.Forms处理依赖注入方面有一点经验,但在WebApi中没有,我想要的是通过我的接口发送数据并在我的类中执行,实现该接口,这就是我所拥有的:

public interface IRepository
{
    IHttpActionResult SendContext(user user);
    IHttpActionResult GetContextData(int id);
}

public class ContextGoneBase : ApiController,IRepository
{
    public  IHttpActionResult GetContextData(int id)
    {
        try
        {
            using (var context = new GoneContext())
            {
                var result = context.user.Where(a => a.id_user == id).Select(w =>
                new { w.user_name, w.cellphone_number, w.user_kind, w.CEP, w.area.area_name, w.district, w.city.city_name, w.city.state.state_name });
                var list = result.ToList();

                if (list != null)
                {
                    return Ok(list);
                }
                else
                {
                    return BadRequest();
                }
            }
        }
        catch (Exception)
        {
            return BadRequest();
        }
    }

在我的控制器里面,我试图做那样的事情:

[Route("86538505")]
    public IHttpActionResult GetData(int id, IRepository repo)
    {
        this._repo = repo;
        var result = _repo.GetContextData(id);
        return result;
    }

但是,它失败了!谢谢!

1 个答案:

答案 0 :(得分:0)

您应该将IRepository作为参数传递给构造函数 将IRepository类型的字段_repo设置为传递的参数值。

public ContextGoneBase (IRepository repository){ //Constructor

  _repo = repository; 

}

。然后使用像Unity这样的IOC容器来使用正确的参数实例化控制器。例如,在使用nuget安装Unity之后,您将拥有一个UnityConfig类文件,您可以在那里注册您的存储库类型。例如,如果您的存储库是存储库类型

 public static class UnityConfig
        {
            public static void RegisterComponents()
            {

// register all your components with the container here
            // it is NOT necessary to register your controllers

            // e.g. container.RegisterType<ITestService, TestService>();
                var container = new UnityContainer();
                container.RegisterType<IRepository,Repository>();

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

现在在Global.asax中调用此方法:

 protected void Application_Start()
        {

            UnityConfig.RegisterComponents();

        }