この記事に従って、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 コントローラーのすべてのインスタンス化はパラメーターなしのコンストラクターを介して行われます。