1

我正在尝试使用 Unity 根据本文注入依赖项:

http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver

这是我的 global.asax 中的内容

void ConfigureApi(HttpConfiguration config)
    {
        var unity = new UnityContainer();
        unity.RegisterType<CustomerController>();
        unity.RegisterType<TPS.Data.Can.IUnitOfWork, TPS.Data.Can.EFRepository.UnitOfWork>(new HierarchicalLifetimeManager());
        config.DependencyResolver = new IoCContainer(unity);
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        ConfigureApi(GlobalConfiguration.Configuration);
    }

这是我的 API 控制器:

public class CustomerController : ApiController
{
    private TPS.Data.Can.IRepository<tblCustomer> _repo;
    private TPS.Data.Can.IUnitOfWork _uow;
    public CustomerController() { }

    public CustomerController(TPS.Data.Can.IUnitOfWork uow) {
        _uow = uow;
        _repo = uow.CustomerRepository;
    }

    // GET api/customer/5
    public IEnumerable<Customer> Get()
    {
        string identity = HttpContext.Current.User.Identity.Name;
        //REFACTOR THIS
        if (String.IsNullOrWhiteSpace(identity))
            identity = "chardie";

        var customers = from c in _repo.Get()
                       where c.SalesRep == identity
                       select new Customer
                       {
                           IDCUST = null,
                           CustCode = c.CustCode,
                           CustName = c.CustName
                       };

        return customers.ToList();
    }

这在我第一次开始调试我的应用程序时有效。如果我在参数化构造函数中设置断点,那么当我第一次点击 Web API 时,就会触发断点。当我在浏览器中点击刷新时,不会调用构造函数,不会注入依赖项,并且 Get() 操作会引发异常,因为预期的存储库为空。

谁能告诉我为什么在第一次请求后没有调用我的构造函数?

谢谢!

克里斯

编辑

FWIW,我完全从 Web API 控制器中删除了无参数构造函数,在我第二次请求它时,我得到了异常:

Type 'TPS.Website.Api.CustomerController' does not have a default constructor

所以看起来我在第一个请求上注入了我的 repo 依赖项,但之后 Web API 控制器的每个实例化都是通过无参数构造函数完成的。

4

3 回答 3

0

我有这个,因为我正在使用这个返回我的依赖范围的解析器,然后在 dispose 中处理容器。因此,在第一次请求之后,容器被处理掉了。

于 2013-11-06T12:16:45.403 回答
0

您没有为控制器指定生命周期。MSDN 状态

如果您未指定生命周期值,则实例将具有默认的容器控制生命周期。它将在每次调用 Resolve 时返回对原始对象的引用。

如果IUnitOfWork依赖是瞬态的,那么控制器也应该是瞬态的。所以试试

unity.RegisterType<CustomerController>(new TransientLifetimeManager());

这可能无法解决整个问题,但听起来像是其中的一部分。您当然不需要无参数构造函数。

于 2013-03-19T14:30:51.680 回答
0

看起来这是因为您没有为 Unity 容器使用单例模式。

有一个私有静态变量而不是 var container = new UnityContainer();

internal static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => new UnityContainer());

然后使用 .Value 属性在代码中访问。

于 2013-12-04T18:15:30.693 回答