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