簡體   English   中英

StructureMap 和工廠類

[英]StructureMap and factory classes

我的代碼中有一些工廠類,不喜歡對 Structermap 的調用。 我應該如何以正確的方式做到這一點?

class ManagerBaseFactory
{
    public ManagerBase GetInstance(SomeEnum e)
    {
        Type t;

        switch (e)
        {
            case SomeEnum.A:
                t = typeof(Manager1);
            case SomeEnum.B:
                t = typeof(Manager2);
            case SomeEnum.C:
                t = typeof(Manager3);
        }
        return (ManagerBase)StructureMap.ObjectFactory.GetInstance(t);
    }
}

我沒有看到以這種方式使用結構 map 的問題。 您不喜歡當前解決方案的哪些方面?

您可以使用您甚至不再需要工廠的命名實例。 結構圖鏈接

public class ServicesRegistry : Registry
{
    public ServicesRegistry()
    {
        For< ManagerBase >().Use< Manager1 >().Named("A");
        For< ManagerBase >().Use< Manager2 >().Named("B");
        For< ManagerBase >().Use< Manager3 >().Named("C");
    }
}

您可以通過調用來檢索正確的

SomeEnum e = SomeEnum.A;
ObjectFactory.GetNamedInstance<ManagerBase>(e.ToString());

如果你絕對不希望你的 ManagerBaseFactory 使用容器,你可以讓它訪問容器中的所有 ManagerBase 實現,並讓它返回正確的實現。 當 StructureMap 在構造函數中看到某個類型的 IEnumerable 時,它將注入它知道的所有該類型的實例。

class ManagerBaseFactory
{
    private readonly IEnumerable<ManagerBase> _managers;

    public ManagerBaseFactory(IEnumerable<ManagerBase> managers)
    {
        _managers = managers;
    }

    public ManagerBase GetInstance(SomeEnum e)
    {
        Type t;

        switch (e)
        {
            case SomeEnum.A:
                t = typeof(Manager1);
                break;
            case SomeEnum.B:
                t = typeof(Manager2);
                break;
            case SomeEnum.C:
                t = typeof(Manager3);
                break;
            default:
                return null;
        }
        return _managers.FirstOrDefault(m => m.GetType().Equals(t));
    }
}

當然,您需要確保所有 ManagerBase 實現都加載到容器中:

var container = new Container(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<ManagerBase>();
    });
});

目前尚不清楚您 object 屬於哪個部分。 您可以進行的一項改進是讓ManagerBaseFactory在其構造函數中接收一個IContainer ,您可以使用它來代替ObjectFactory static 網關。 然后你可以把ManagerBaseFactory從容器中拉出來,容器就會將自己注入到工廠中。 如果沒有 static 依賴項,工廠將更容易進行單元測試。

您也可以將 return 語句直接放在 switch 中,這樣您就可以利用 generics:

case SomeEnum.A:
  return _container.GetInstance<Manager1>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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