如何使用静态工厂方法创建对象
本文关键字:方法 创建对象 工厂 静态 何使用 | 更新日期: 2023-09-27 18:09:46
我知道Unity可以配置为使用类的构造函数来创建类的实例(如下所示),但这不是我想要的。
container.RegisterType<IAuthoringRepository, AuthoringRepository>();
我想配置Unity使用一个工厂方法与windows身份传递作为参数(即:RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent())
)当解析IAuthoringRepository
类型。我该怎么做呢?
一种方法是让RepositoryFactory实现IRepositoryFactory,然后注册它。已解决的类型可以获得一个工厂,然后调用它的CreateAuthoringRepository方法。如果需要的话,你可以创建一个名为CreateAuthoringRepositoryForCurrentIdentity的重载,或者在Unity中注册一个工厂的IIdentity依赖项。
我可能只是注入一个工厂,并离开CreateAuthoringRepository方法,因为你有它,然后让客户端通过windowidentity . getcurrent()。这样标识就始终是新鲜的,并且您可以模拟工厂进行测试。
或者,你可以用InjectionFactory指定一个委托:
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; }
}
这个打印:
调试解析模型调试-调用工厂使用System.Security.Principal.WindowsIdentity的存储库标识构建模型
这是Unity 2.0的。对于早期版本,请参阅StaticFactoryExtension。
现在InjectionFactory方法已经过时了。这就是为什么最好使用方法RegisterFactory。下面我将展示前面的代码是如何更改的。我改变了方法CreateAuthoringRepository。现在它是带有一个参数的static方法IUnityContainer container
void Main()
{
using (var container = new UnityContainer())
{
container.RegisterFactory<IAuthoringRepository>(CreateAuthoringRepository);
Console.WriteLine("debug - resolving model");
var model = container.Resolve<Model>();
}
}
public static IAuthoringRepository CreateAuthoringRepository(IUnityContainer container)
{
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; }
}