我正在使用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; }
}
答案 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 ”来注册和解析(服务位置模式)类型,最好还是确保在应用程序生命周期内只注册一次。