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 にヒットしたときにブレークポイントにヒットします。ブラウザーで更新を押すと、コンストラクターが呼び出され、依存関係が注入されず、予想されるリポジトリが null であるため、Get() アクションが例外をスローします。

最初のリクエストの後にコンストラクターが呼び出されない理由を誰か教えてもらえますか?

ありがとう!

クリス

編集

FWIW、Web APIコントローラーからパラメーターなしのコンストラクターを完全に削除しました.2回目のリクエストで例外が発生しました:

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

そのため、最初のリクエストでレポの依存関係が注入されているように見えますが、その後、Web API コントローラーのすべてのインスタンス化はパラメーターなしのコンストラクターを介して行われます。

4

3 に答える 3

0

コントローラーのライフサイクルを指定していません。MSDN の状態

ライフタイムの値を指定しない場合、インスタンスにはデフォルトのコンテナー制御のライフタイムが設定されます。Resolve を呼び出すたびに、元のオブジェクトへの参照が返されます。

IUnitOfWork依存関係が一時的である場合、コントローラーも一時的である必要があります。だから試してみてください

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

これで問題全体が解決するわけではありませんが、問題の一部のように思えます。確かに、パラメーターなしのコンストラクターは必要ありません。

于 2013-03-19T14:30:51.680 に答える