Unity Application Block, Как передать параметр в Injection Factory? - PullRequest
8 голосов
/ 03 декабря 2010

Вот что у меня сейчас

  Container.RegisterType<IUserManager, UserManagerMock>();
  Container.RegisterType<IUser, UserMock>(
                new InjectionFactory(
                    (c) => c.Resolve<IUserManager>().GetUser("John")));

и получи

Container.Resolve<IProfile>();

Я хочу передать имя в качестве параметра Factory, чтобы иметь возможность разрешать пользовательский объект с именем; Примерно так:

 Container.Resolve<IProfile>("Jonh");

Как я могу изменить тип регистрации для этого случая?

Ответы [ 2 ]

7 голосов
/ 04 декабря 2010

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

В вашей ситуации вы хотите получить профиль для определенного пользователя.Как правило, это то, что вы хотели бы иметь фабрику для.Вот пример этого:

// Definition
public interface IProfileFactory
{
    IProfile CreateProfileForUser(string username);
}

// Usage
var profile = Container.Resolve<IProfileFactory>()
    .CreateProfileForUser("John");

// Registration
Container.RegisterType<IProfileFactory, ProfileFactory>();

// Mock implementation
public class ProfileFactory : IProfileFactory
{
    public IProfile CreateProfileForUser(string username)
    {
        IUser user = Container.Resolve<IUserManager>()
            .GetUser(username);

        return new UserProfile(user);
    }
}

Надеюсь, это поможет.

6 голосов
/ 03 декабря 2010

Метод Resolve позволяет передавать параметры ResolverOverride. Подтип ResolverOverride - это ParameterOverride, который можно использовать для передачи параметра в разрешенный конструктор.

Вы можете сделать это следующим образом (параметр - Имя, а переданное значение - Джон):

Container.Resolve<IProfile>(new ParameterOverride("Name", "John"));
...