Единство - решение без разрешения () - PullRequest
2 голосов
/ 13 апреля 2011

Я хотел бы просто разметить свойство с атрибутом [DoInjection] и сделать так, чтобы единство делало инъекцию. Я не хочу использовать prop = Unity.Resolve (type). Это боль и грязно. У единства есть атрибуты для этого или я должен построить свой собственный?

Редактировать: зарегистрироваться в App.Main

ISessionFactory sf = new SessionFactory();
            container.RegisterType<IRepository, CustomerRepository>(new InjectionConstructor(sf.CurrentUoW));
            container.RegisterInstance<IUnitOfWork>(sf.CurrentUoW);

Использование [Dependancy] для свойства IUnitOfWork в другом классе ClassX, но оно всегда равно нулю. Нужно ли создавать экземпляр ClassX с использованием Unity, чтобы заставить это работать? Похоже, я должен. Мне это не нравится

1 Ответ

2 голосов
/ 13 апреля 2011

Unity имеет DependencyAttribute, который вы можете использовать для этого:

public class MyObject
{
  private SomeOtherObject _dependentObject;

  [Dependency]
  public SomeOtherObject DependentObject 
  {
    get { return _dependentObject; }
    set { _dependentObject = value; }
  }
}

http://msdn.microsoft.com/en-us/library/ff650198.aspx

Исходя из вашего вопроса, может показаться, что вы пытаетесь использовать Unity не в том месте, а ваш дизайнерский смысл говорил вам, что это не правильно. Вы должны видеть только Unity, где вы загружаете свое приложение. Это ваш метод Main в консольном приложении или Global.asax в веб-приложении или приложении wcf. Идея состоит в том, чтобы продолжать полагаться на зависимости по всей цепочке до тех пор, пока вы не доберетесь до того места, где вы загрузитесь, и решите только этот один объект верхнего уровня, используя ваш контейнер IoC. В консольном приложении я делаю это:

class Program
{
    static void Main(string[] args)
    {
        using (var container = new UnityContainer())
        {
            container
                .AddExtension(new ConfigureForConsole(args))
                .Resolve<MyApplication>()
                .Execute();
        }
    }
}

http://www.agileatwork.com/console-application-with-ioc/

В этом случае MyApplication - мой объект верхнего уровня (здесь не обязательно должен быть интерфейс). ConfigureForConsole - это одноразовое расширение контейнера, содержащее все строки RegisterType. В качестве альтернативы вы можете инициализировать контейнер из App.Config здесь. Идея в том, что ваш метод Main почти ничего не содержит. Еще одним преимуществом этого подхода является то, что он делает ваш код более переносимым. Я считаю, что консольные приложения обычно превращаются в службы Windows, и поддержание чистоты делает этот переход довольно безболезненным.

...