我知道 Unity 可以配置为使用类的构造函数来创建类的实例(如下所示),但这不是我想要的。
container.RegisterType<IAuthoringRepository, AuthoringRepository>();
我想将 Unity 配置为在解析 IAuthoringRepository
。我该怎么做?
最佳答案
一种方法是让 RepositoryFactory 实现 IRepositoryFactory,然后注册它。已解析的类型可以获得工厂,然后调用其 CreateAuthoringRepository 方法。如果需要,您可以创建一个名为 CreateAuthoringRepositoryForCurrentIdentity 的重载,或者使用 Unity 注册工厂的 IIdentity 依赖项。
我可能只是注入(inject)一个工厂并保留您拥有的 CreateAuthoringRepository 方法,然后让客户端传递 WindowsIdentity.GetCurrent()。这样身份总是新鲜的,你可以模拟工厂进行测试。
或者,您可以使用 InjectionFactory 指定委托(delegate):
void Main()
{
using (var container = new UnityContainer())
{
container.RegisterType<IAuthoringRepository>(
new InjectionFactory(c => CreateAuthoringRepository()));
Console.WriteLine("debug - resolving model");
var model = container.Resolve<Model>();
}
}
public IAuthoringRepository CreateAuthoringRepository()
{
Console.WriteLine("debug - calling factory");
return new AuthoringRepository
{ Identity = WindowsIdentity.GetCurrent() };
}
public class Model
{
public Model(IAuthoringRepository repository)
{
Console.WriteLine(
"Constructing model with repository identity of "
+ repository.Identity);
}
}
public interface IAuthoringRepository
{
IIdentity Identity { get; }
}
public class AuthoringRepository : IAuthoringRepository
{
public IIdentity Identity { get; set; }
}
这打印:
debug - resolving model debug - calling factory Constructing model with repository identity of System.Security.Principal.WindowsIdentity
这是针对 Unity 2.0 的。对于早期版本,请参阅 StaticFactoryExtension .
关于c# - 如何使用静态工厂方法创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7576761/