0

Unity コンテナの同じインターフェイスに 2 つのクラスを登録できるようにしたいと考えています。次に、パラメーターに基づいて現在の実装を選択したいと思います。

これが私のインターフェースです:

public interface ICheckService
{
    HttpResponseMessage Validate(string p1, string p2);
}
}

私のサービス:

public class CheckService1 : ICheckService
{
    public HttpResponseMessage Validate(string p1, string p2)
    {
      /////code
    }
}

public class CheckService2 : ICheckService
{
    public HttpResponseMessage Validate(string p1, string p2)
    {
        ////code
    }
}

bootstraper.cs で、サービスを宣言します。

        `container.RegisterType<ICheckService, CheckService1>();`
        `container.RegisterType<ICheckService, CheckService2>();`

私のAPIコントローラー:

public class ServiceController : ApiController
{
    private readonly ICheckService _checkService;

    public ServiceController(ICheckService checkService)
    {
        _checkService = checkService;
    }
    [HttpGet]
    public HttpResponseMessage Validate(string p1, string p2)
    {
        return _checkService.Validate(p1, p2);
    }
 }

ここで、API を呼び出すときに、p1 パラメータに基づいて実装を選択したいと思います。

p1 が Service1 と等しい場合、Validate メソッドは Service1 クラスから呼び出され、p1 が Service2 と等しい場合、検証メソッドは Service2 クラスから呼び出されます。

ご協力いただきありがとうございます。

4

3 に答える 3

1

そのためには、コンテナではなくファクトリを使用する必要があります。ファクトリの実装は、内部的にコンテナーから適切な実装を要求できます (つまり、これは単なる実装の詳細であり、ファクトリの呼び出し元が認識すべきものではありません)。

しかし、要点は、IoC を直接使用することは、あなたのケースには適していないということです。

public class ServiceController : ApiController
{
    private readonly ICheckServiceFactory _checkFactory;

    public ServiceController(ICheckServiceFactory factory)
    {
        _checkFactory = factory;
    }
    [HttpGet]
    public HttpResponseMessage Validate(string p1, string p2)
    {
        var service = _checkFactory.Create(p1);
        service.Validate(p1, p2);
    }
 }
于 2013-03-28T11:33:34.500 に答える
0

CheckService1 and CheckService2 in your case are implementation classes/details of the Validation. You can create a CheckServiceFactory that can create those classes for you during run-time. Register the factory class and not the implementation classes.

于 2016-08-10T16:55:45.730 に答える