Зависимые объекты с помощью RegisterInstance - PullRequest
2 голосов
/ 21 марта 2011

Я использую блок Unity для реализации Ioc.Я использую registerInstance, и так оно и будет.не могу изменить это.Проблема в том, что если мы сделаем это, как насчет зависимых объектов?Как справиться с этим.скажем,

public ClientUser(IDataServiceManager dsm)
{
    oDataServiceManager = dsm;
}

, который работает с registerType, но как мы должны сначала создать экземпляр

IClientUser clientUser = new ClientUser();
SnapFlowUnityContainer.Instance.RegisterInstance<IClientUser>(clientUser);

Как это может работать?наш консультант сказал, используйте частные методы получения для установки зависимостей, пусть класс обрабатывает свой зависимый объект?не мог понять, как это сделать?


Обновление: Мне нужно знать, где я не прав, Как он будет создавать объект Dataservicemanger при создании clientUser
BootStrapper

IDataServiceManager dsm = new DataServiceManager();
IClientUser clientUser = new ClientUser();
SnapFlowUnityContainer.Instance.RegisterInstance<IDataServiceManager>(dsm);
SnapFlowUnityContainer.Instance.RegisterInstance<IClientUser>(clientUser);

Модульный тест:

BootStrapper.Register();
IClientUser oIclientUser = SnapFlowUnityContainer.Instance.Resolve<IClientUser>();

ClientUser Class:

public class ClientUser : UserServiceBase, IClientUser
{
    [Dependency]
    private IDataServiceManager DataServiceMgr { get; set; }
}

Ответы [ 4 ]

3 голосов
/ 07 апреля 2011

Если я вас правильно понимаю, это должно сработать

SnapFlowUnityContainer.Instance.RegisterType<IDataServiceManager, DataServiceManager>();

var clientUser = SnapFlowUnityContainer.Instance.Resolve<ClientUser>();

SnapFlowUnityContainer.Instance.RegisterInstance<IClientUser>(clientUser);

ClientUser получит DataServiceManager при Resolve

1 голос
/ 21 марта 2011

Если вы хотите включить внедрение свойства в Unity, вы можете поместить атрибут [Dependency] в свойство, в котором вы хотите его включить.Примерно так:

[Dependency]
public IClientUser  ClientUser
{
    get { return _clientUser; }
    set
    {
        if (value == null) throw new ArgumentNullException("value",
            String.Format(Thread.CurrentThread.CurrentUICulture,
            Properties.Resource.ERR_ARGUMENT_NULL_USERSERVICE));

        _clientUser = value;
    }
}

Тогда, если вы используете RegisterInstance (clientUser), как в вашем примере, это должно работать.Другое дело, когда вам нужно подключить объекты, не созданные контейнером.Тогда вы должны использовать метод BuildUp

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

Томас

0 голосов
/ 24 августа 2011

Вам не нужен атрибут [Зависимость] в свойствах, это можно сделать либо через файл конфигурации, либо через свободный API регистрации. Есть два способа добиться этого с помощью свободного API, для вашего сценария вы, вероятно, будете использовать первый метод:

Метод 1:

SnapFlowUnityContainer.Instance
  .Configure<InjectedMembers>()
                    .ConfigureInjectionFor<IClientUser>(
                        new InjectionProperty("DataServiceMgr"));

Метод 2:

SnapFlowUnityContainer.Instance
  .RegisterType<IClientUser, ClientUser>(
                    new ExternallyControlledLifetimeManager(),
                    new InjectionProperty("DataServiceMgr"))
  .BuildUp<IClientUser>(clientUser);

Будьте осторожны с использованием «SnapFlowUnityContainer. Экземпляр » для регистрации и разрешения типов (шаблон расположения службы), желательно, чтобы убедиться, что регистрация происходит только один раз за время существования приложения.

0 голосов
/ 24 марта 2011
public class ClientUser : UserServiceBase, IClientUser   
{
     IDataServiceManager _dataServiceManager;      
     public ClientUser()    
     {             
     }         

     private IDataServiceManager DataServiceMgr     
     {         
          get { 
                _dataServiceManager = SnapFlowUnityContainer.Instance.Resolve<IClientUser>();   
                return _dataServiceManager; 
              }         
       }
}
...