C# 我可以编写一个Unity扩展来获得将依赖属性应用于所有公共属性的效果吗?

C# 我可以编写一个Unity扩展来获得将依赖属性应用于所有公共属性的效果吗?,c#,unity-container,C#,Unity Container,我认为这应该很容易,但我不知道这样做的确切机制(见问题标题) 它的工作方式可能是这样的: [AutoInjectProperties] public class C { public class C(bool b) { if(b) { this.MyClass3 = new MyClass3(); // prevents auto inject } } public MyClass1 { get; set; } // auto inject

我认为这应该很容易,但我不知道这样做的确切机制(见问题标题)

它的工作方式可能是这样的:

[AutoInjectProperties]
public class C
{
  public class C(bool b)
  {
    if(b)
    {
      this.MyClass3 = new MyClass3(); // prevents auto inject
    }
  }
  public MyClass1 { get; set; } // auto inject
  public MyClass2 { get; }
  public MyClass3 { get; set; } // auto inject if null after construction
}

我根本不会使用
DependencyAttribute
。请改用
dependencProperty

container.RegisterType<IMyInterface, MyImplementation>(new DependencyProperty("Foo"));
如果您在解决
MyImplementation
之前注册
IFoo
,Unity将完成它的工作并为您注入它


更新

public类所有属性:InjectionMember
{
私有只读列表属性;
公共所有财产()
{
this.properties=新列表();
}
public override void AddPolicies(类型serviceType、类型implementationType、字符串名称、IPolicyList策略)
{
如果(implementationType==null)抛出新的ArgumentNullException(“implementationType”);
//获取所有具有setter且不是索引器的属性
var settableProperties=implementationType
.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
其中(pi=>pi.CanWrite&&pi.GetSetMethod(false)!=null&&pi.GetIndexParameters().Length==0);
//让Unity基础设施为您完成繁重的工作
foreach(settableProperties中的PropertyInfo属性)
{
Add(newinjectionProperty(property.Name));
}
ForEach(p=>p.addPolicys(serviceType,implementationType,name,policies));
}
}
像那样使用它

container.RegisterType<Foo>(new AllProperties());
container.RegisterType(new-AllProperties());

它将注入所有具有公共setter的属性。

不过,有时为了方便起见,我喜欢以创造性的方式使用东西-我认为最好有一个可以翻转的开关,我所有的公共读/写属性都将从容器中带出一个实例,而不是它们的defulat null(通常无用)然后,unity基础设施将负责递归注入类型成员?@aaronadide您所说的递归注入类型成员是什么意思?如果MyClass1/2/3有依赖项,它们也会得到解决。是的,这就是我的意思,谢谢你花时间来帮助我,尽管这样做可能违背你的理念