Атрибут Unity [Dependency] не разрешается - PullRequest
1 голос
/ 15 января 2010

У меня есть следующий код, и когда я пытаюсь его запустить, я вижу, что BrokerProvider не разрешается. Вот мой код:

static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            UnityConfigurationSection section = (UnityConfigurationSection) ConfigurationManager.GetSection("unity");
            section.Containers.Default.Configure(container);

            new TestBroker().RunTestBroker();              
        }


class TestBroker
    {
        private IBrokerProvider brokerProvider;

        public void RunTestBroker()
        {
            List<IPortfolio> portfolios = BrokerProvider.GetPortfolios();
        }

        [Dependency]
        public IBrokerProvider BrokerProvider
        {
            get { return brokerProvider; }
            set { brokerProvider = value; }
        }
    }

Соответствующий конфиг

 <unity>
    <typeAliases>
      <typeAlias alias="string" type="System.String, mscorlib" />
      <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
      <typeAlias alias="IBrokerProvider" type="PA.Common.Interfaces.IBrokerProvider, PA.Common" />

      <typeAlias alias="PManager" type="PA.BrokerProviders.PManager, PA.BrokerProviders" />
    </typeAliases>
    <containers>
      <container>
        <types>
          <type type="IBrokerProvider" mapTo="PManager">
            <lifetime type="singleton" />
          </type>
        </types>
      </container>
    </containers>
  </unity>

Другой вопрос: нужно ли мне повторять те же 3 строки кода, которые есть у меня в разделе main, во всех остальных классах, для которых я хотел бы использовать единство или достаточно установить его один раз?

1 Ответ

10 голосов
/ 15 января 2010

Это потому, что вы создаете TestBroker напрямую, вызывая оператор new для него:

new TestBroker().RunTestBroker();

Чтобы единство разрешило ваши зависимости, вам нужно вызвать структуру следующим образом:

var broker = container.Resolve<TestBroker>();

IUnityContainer - это интерфейс, который будет выполнять всю работу за вас - т.е. преобразовывать типы в экземпляры.Вам нужно только создать его один раз, а затем просто передать его приложению там, где вам когда-либо понадобится.

...