Unity 只会查看公共构造函数,因此您需要将此构造函数设为公开。
我真的希望这个类是公开的,但我希望它只能通过工厂创建
在这种情况下,创建一个工厂:
public class MyClassFactory : IMyClassFactory
{
private readonly IService service;
public MyClassFactory(IService service)
{
this.service = service;
}
MyClass IMyClassFactory.CreateNew()
{
return new MyClass(this.service);
}
}
并注册:
_container.Register<IMyClassFactory, MyClassFactory>();
并解决:
_container.Resolve<IMyClassFactory>().CreateNew();
您还可以使用 Unity 的InjectionFactory
:
container.Register<MyClass>(new InjectionFactory(c =>
{
return new MyClass(c.Resolve<IService>());
}));
为此,包含此代码的程序集应该能够看到包含MyClass
. 换句话说,该MyClass
程序集应标有InternalsVisibleTo
。
什么也可以工作如下:
public static class MyClassFactory
{
public static MyClass CreateNew(IService service)
{
return new MyClass(service);
}
}
container.Register<MyClass>(new InjectionFactory(c =>
{
return MyClassFactory.Create(c.Resolve<IService>());
}));
尽管您不必公开构造函数,但这是混淆代码的好方法:-)