IoC - Unity, как работает RegisterInstance, я прав? - PullRequest
8 голосов
/ 22 марта 2011

Я внедряю Ioc, и я хочу убедиться в правильности нескольких вещей.

  1. Если я использую RegisterInstance, при разрешении он всегда будет возвращать объект-одиночка?
  2. BootStrapper будет загружен в Global.asax или в какое-то место, где он будет загружен изначально, что означает, что все экземпляры будут одноэлементными?

Но я хочу знать, как
1. Создайте отдельный экземпляр для разрешения, PerResolve не будет работать с RegisterInstance, он работает только с RegisterType.
2. Если я сделаю зависимый объект статическим свойством, он будет работать так же, если я смогусоздать отдельный экземпляр для разрешения?

, пожалуйста, помогите?

public class ClientUser : UserServiceBase, IClientUser
{
    private  IDataServiceManager _dataServiceManager;
    public ClientUser()
    {

    }

    private IDataServiceManager DataServiceMgr
    {
        get
        {
            if (_dataServiceManager == null)
                _dataServiceManager = ProjectContainer.Instance.Resolve<IDataServiceManager>();

            return _dataServiceManager;
        }
    }    

1 Ответ

13 голосов
/ 22 марта 2011

Вы не можете использовать RegisterInstance, если хотите использовать экземпляр PerResolve.Либо используйте RegisterInstance, который будет всегда возвращать один и тот же экземпляр объекта (то есть точку регистрации экземпляра), либо используйте RegisterType и определите PerResolveLifetimeManager.

RegisterInstance по умолчанию использует ContainerControlledLifetimeManager,Единственным другим значимым менеджером времени жизни для RegisterInstance является ExternallyControlledLifetimeManager.

TransientLifetimeManager и PerResolveLifetimeManager, которые не имеют смысла, потому что эти времена жизни должны создавать новый экземпляр каждый раз, когда вы вызываете Resolve.

PerThreadLifetimeManager бесполезен в сценариях, где вы не контролируете многопоточность.

...