[英]How to create objects using a static factory method?
我知道Unity可以配置為使用類的構造函數來創建類的實例(如下所示),但這不是我想要的。
container.RegisterType<IAuthoringRepository, AuthoringRepository>();
我想在解析一種IAuthoringRepository
時,將Unity配置為使用一個工廠方法,將windows身份作為參數傳遞(即: RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent())
)。 我該怎么做呢?
一種方法是讓RepositoryFactory實現IRepositoryFactory,然后注冊它。 已解析的類型可以獲取工廠,然后調用其CreateAuthoringRepository方法。 如果需要,您可以創建一個名為CreateAuthoringRepositoryForCurrentIdentity的重載,或者使用Unity注冊工廠的IIdentity依賴項。
我可能只是注入一個工廠並保留CreateAuthoringRepository方法,然后讓客戶端通過WindowsIdentity.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; }
}
這打印:
debug - resolving model debug - calling factory Constructing model with repository identity of System.Security.Principal.WindowsIdentity
這是針對Unity 2.0的。 對於早期版本,請參閱StaticFactoryExtension 。
現在方法InjectionFactory已經過時了。 這就是為什么使用RegisterFactory方法會更好。 下面我將展示以前的代碼如何更改。 你怎么看我改變了CreateAuthoringRepository方法。 現在它是帶有一個參數IUnityContainer容器的靜態方法
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; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.