1

私は構造体マップをweb apiでIOCとして使用しています。私はコントローラに注入依存関係があり、具体的な型も依存しています。Structuremap - 依存関係のある依存関係

コントローラ

[RoutePrefix("api/products")] 
public class ProductsController : BaseApiController 
{ 

    //private readonly ProductRepository _manageProducts; 
    private readonly IProductFactory _productFactory; 
    private readonly IGenericRepository _genericRepository; 

    public ProductsController(IProductFactory productFactory, IGenericRepository genericRepository) 
    { 
     _productFactory = productFactory; 
     _genericRepository = genericRepository; 
     //_manageProducts = new ProductRepository(); 
    } 

    [Authorize] 
    [Route("addProduct")] 
    public IHttpActionResult AddNewProduct(ProductViewModels.AddProductViewModel product) 
    { 
     if (User.IsInRole("Admin")) 
     { 

      _productFactory.CreateProduct(product); 
      return Ok("Product Successfully Added"); 
     } 
     return BadRequest("Your must have Administrator rights to perform the operation."); 
    } 
} 

工場

public class ProductFactory : IProductFactory 
{ 
    private readonly IGenericRepository _genericRepository; 

    public ProductFactory(IGenericRepository genericRepository) 
    { 
     _genericRepository = genericRepository; 
    } 


    /// <summary> 
    /// Creates the product. 
    /// </summary> 
    /// <returns>The product.</returns> 
    /// <param name="viewModel">New product.</param> 
    public Product CreateProduct(ProductViewModels.AddProductViewModel viewModel) 
    { 
     var productToBeAdded = new Product 
     { 
      Title = viewModel.Title, 
      ISBN = viewModel.ISBN, 
     }; 
     return productToBeAdded; 
    } 
} 

私はnull参照例外のため、このランタイムエラーを取得し、製品のコントローラaddproductsを呼び出そうとすると:

{ 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "Object reference not set to an instance of an object.", 
    "ExceptionType": "System.NullReferenceException", 
    "StackTrace": " at ICEBookshop.API.Factories.ProductFactory.CreateProduct(AddProductViewModel viewModel) in C:\\Users\\GOWDY_N\\Source\\Repos\\ICEBookshop.API\\ICEBookshop.API\\P00603ClientApi\\Factories\\ProductFactory.cs:line 29\r\n at ICEBookshop.API.Controllers.ProductsController.AddNewProduct(AddProductViewModel product) in C:\\Users\\GOWDY_N\\Source\\Repos\\ICEBookshop.API\\ICEBookshop.API\\P00603ClientApi\\Controllers\\ProductsController.cs:line 95\r\n at lambda_method(Closure , Object , Object[])\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()" 
} 
For<IProductFactory>() 
        .Use<ProductFactory>() 
        .Ctor<IGenericRepository>() 
        .Is<GenericRepository<ApplicationDbContext>>().Named("DefaultInstanceKey"); 

しかし、それはどちらも動作しません:3210 これは、私はそれが私の工場を解決する方法を知っているので、これはそれを修正するだろうと思った私は

public class DefaultRegistry : Registry 
{ 
    #region Constructors and Destructors 

    public DefaultRegistry() 
    { 
     Scan(
      scan => 
      { 
       scan.TheCallingAssembly(); 
       scan.WithDefaultConventions(); 
      }); 
     For<IGenericRepository>().Use<GenericRepository<ApplicationDbContext>>(); 
     For<IProductFactory>() 
      .Use<ProductFactory>() 
      .Ctor<IGenericRepository>() 
      .Is<GenericRepository<ApplicationDbContext>>().Named("DefaultInstanceKey"); 


     #endregion 
    } 
} 

のStructureMapでやったものです。誰もがこれを修正する方法を知っていますか?

答えて

1

2つのインターフェイスとその実装を登録するだけです。フレームワークは、ターゲットを解決する際に依存関係を解決します。

For<IGenericRepository>().Use<GenericRepository<ApplicationDbContext>>(); 
For<IProductFactory>().Use<ProductFactory>();