Это правильный способ избежать шаблона ServiceLocator, используя Constructor Injection?

Это правильный способ избежать шаблона ServiceLocator, используя Constructor Injection?

public interface IEntitySomethingBase<TEntity>
{
    //Stuff
}

public class AccountEntitySomething : IEntitySomethingBase<Account>
{
    //Stuff
}

public class CustomerEntitySomething : IEntitySomethingBase<Customer>
{
    //Stuff
}

public class OrderEntitySomething : IEntitySomethingBase<Order>
{
    //Stuff
}
//Ditto, any number

Использование класса, использующего ServiceLocator, которого я хочу избежать.

public class MyConsumingClass
{
    public object DoSomething<TEntity>(TEntity entity)
        where TEntity : class
    {
        var thing = ServiceLocator.Current.GetInstance<IEntitySomethingBase<TEntity>>();
    }
}

Решение с использованием MEF. Изменить выше *EntitySomething для экспорта, и

public class MyConsumingClass
{
    private List<Lazy<IEntitySomethingBase<Object>>> _things;

    [ImportingConstructor]
    public MyConsumingClass([ImportMany] List<Lazy<IEntitySomethingBase<Object>>> things)
    {
        _things = things;
    }

    public object DoSomething<TEntity>(TEntity entity)
        where TEntity : class
    {
        var thing = _things.Cast<IEntityInformationExtractor<TEntity>>().Where(t => t.GetType().FullName == entity.GetType().FullName).FirstOrDefault();
    }
}

На самом деле еще не пробовал, но было интересно, есть ли другие пути для достижения этой цели.

Спасибо

1 ответ

Если мое понимание верно, вам нужна фабрика

То, чего вы пытаетесь достичь, на самом деле стало действительно обычным, и это потому, что контейнеры IoC разрешают зависимости при запуске приложения, и в большинстве приложений требуемые зависимости необходимо вводить на основании некоторых ограничений.

Контейнеры Moderns IoC пытаются решить эту проблему, как Guice for Java

Прочтите это, чтобы получить больше информации о фабриках:

https://github.com/ninject/ninject.extensions.factory/wiki

Вам нужна фабрика для создания правильного типа на основе параметра, и вы можете разместить вызов вашего локатора службы внутри своей фабрики (я знаю, что вы используете анти-шаблон локатора службы, но вы перемещаете его из своего домена к фабрике фабрика используется только для соединения объектов, поэтому обычно приходится обращаться к IoC внутри фабрики).

Для справки:

http://www.youtube.com/watch?v=wEhu57pih5w&feature=player_embedded

Другие вопросы по тегам