Тип параметри на конкретен метод за регистриране на Autofac

Използвам Autofac IOC с валидиране на constructor. Не мога да разбера как да регистрирам класовете в IOC, така че LogotypeService да получи LogoImageValidator и AdService да получи AdValidator инжектирани в неговите конструктори.

Не искам да посочвам кой екземпляр на SomeClass трябва да бъде инжектиран.

Аз имам:

  • Един интерфейс за валидиране (IImageValidator)
  • Един базов клас за общата логика за валидиране (ImageValidatorBase)
  • Два подкласа, които съдържат специфична логика за проверка (LogoImageValidator и AdImageValidator)
  • Един сервизен интерфейс (IService)
  • Две услуги, всяка от които трябва да използва различни подкласове за валидиране. (LogotypeService трябва да използва LogoImageValidator) и (AdService трябва да използва AdValidator)

Интерфейс

public interface IImageValidator
{
    bool ValidFileSize();
}

Базов клас:

public abstract class ImageValidatorBase : IImageValidator
{    
    //constructor omitted
    Public abstract ValidFileSize()
    {
       //shared code
    }
}

Подклас LogoImageValidator

public class LogoImageValidator : ImageValidator
{
    //constructor omitted
    public override bool ValidFileSize()
    {
        //class specific code
    }
}

Подклас AdImageValidator

public class AdImageValidator : ImageValidator
{
    //constructor omitted
    public override bool ValidFileSize()
    {
        //class specific code
    }
}

IService

public interface IService{
    bool ValidFileSize();
}

LogotypeService

 public class LogotypeService : IService
 {
    private readonly ISomeClass _someClass;
    private readonly IImageValidator _imageValidator;

    public LogotypeService(ISomeClass someClass, IImageValidator imageValidator)
    {
        _someClass = someClass;
        _imageValidator = imageValidator;
    }

    public bool ValidFileSize()
    {
       _imageValidator.ValidFileSize();//use LogoImageValidator subclass here            
    }
}

AdService

 public class AdService : IService
 {
    private readonly ISomeClass _someClass;
    private readonly IImageValidator _imageValidator;

    public AdService(ISomeClass someClass, IImageValidator imageValidator)
    {
        _someClass = someClass;
        _imageValidator = imageValidator;
    }

    public bool ValidFileSize()
    {
       _imageValidator.ValidFileSize();//use AdValidator subclass here    
    }
}

Някакви идеи?


person Tim Hansson    schedule 11.04.2014    source източник
comment
Какви методи има вашият IService интерфейс?   -  person Steven    schedule 11.04.2014
comment
Здравейте, добавих IService в последната си редакция. Той излага: bool ValidFileSize()   -  person Tim Hansson    schedule 11.04.2014
comment
Това донякъде се припокрива с това: stackoverflow.com/questions/ 16699588/   -  person Travis Illig    schedule 12.04.2014
comment
Здравей @TravisIllig. Вашият линк всъщност реши проблема. Благодаря!   -  person Tim Hansson    schedule 16.04.2014
comment
Ще го добавя като отговор, така че хората да знаят, че въпросът е отговорен.   -  person Travis Illig    schedule 17.04.2014


Отговори (1)


Това изглежда се припокрива с този въпрос: Инжектиране на конкретен тип с Autofac

Отговорът там предполага използването на различни интерфейси въз основа на контекста.

person Travis Illig    schedule 16.04.2014