簡體   English   中英

如何使用靜態工廠方法創建對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM