具有RegisterInstance的从属对象

时间:2011-03-21 09:56:39

标签: c# dependency-injection unity-container

我正在使用Unity块进行Ioc实现。我正在使用registerInstance,这就是它的方式。无法改变它。问题是如果我们这样做依赖对象呢?如何处理。让我们说

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

与registerType一起使用,但我们必须先创建实例

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

这怎么办?我们的顾问说,使用私有getters设置依赖项,让类处理其依赖对象?无法理解如何做到这一点?


更新 我需要知道我错在哪里,当我创建clientUser时它将如何创建Dataservicemanger的对象 引导程序

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类:

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

4 个答案:

答案 0 :(得分:3)

如果我理解正确,这应该有效

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

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

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

ClientUser会在DataServiceManager

之后获得Resolve

答案 1 :(得分:1)

如果要在Unity中启用Property注入,可以在要启用它的属性上放置[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

希望这有帮助,

托马斯

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您不需要属性上的[Dependency]属性,可以通过配置文件或流畅的注册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。 Instance ”来注册和解析(服务位置模式)类型,最好还是确保在应用程序生命周期内只注册一次。