我是StructureMap的新手,並且存在以下問題,這似乎與其他人遇到的問題相反。我有一個通用的UnitOfWorkClass
定義如下:註冊具有通用類型的Contrete類與StructureMap
public class UnitOfWork<TContext> : IUnitOfWork
where TContext : IContext, new()
{
....
}
但是我感到困惑,你會如何註冊這個解決,如果我已經得到了具體的實例幾種不同的可能性。
我見過很多例子,人們有一個通用的接口,如:
StructureMap Auto registration for generic types using Scan
所以我想這個問題可以問我是否需要重新看看我的設計呢!
非常感謝!
#編輯可能的解決方案?所以我有一個類,它有兩個參數到構造函數:
public MyClass(IUnitOfWork firstConstructor,
IUnitOfWork secondConstructor)
{
...
}
然後我的對象圖被建我執行以下操作:
ObjectFactory.Initialize(cfg =>
{
var firstContext = cfg.For<IContext>().Use<MyFirstContext>();
var secondContext = cfg.For<IContext>().Use<MySecondContext>();
var firstUnitOfWork =
cfg.For<IUnitOfWork>().Use<UnitOfWork<MyFirstContext>>()
.Ctor<IContext>().Is(firstContext);
var secondUnitOfWork =
cfg.For<IUnitOfWork>().Use<UnitOfWork<MySecondContext>>()
.Ctor<IContext>().Is(secondContext);
cfg.For<IMyClass>().Use<MySecondContext>()
.Ctor<IUnitOfWork>("firstConstructor").Is(firstUnitOfWork)
.Ctor<IUnitOfWork>("secondConstructor").Is(secondUnitOfWork);
});
所以我在這裏所做的是:
- 解決了我的依賴於IContext並存儲它們的變量
- 注入的解決IContext到我IUnitOfWork構造
- 那麼我就可以解決的正確通用的UnitOfWork構造正確
感覺並不完美,但我覺得這適合我的需要...
如果接口不是通用的,那麼StructureMap如何才能找到'TContext'類型參數中'填充'的類型?您必須通過明確註冊它的封閉版本來提供該類型,或者使該接口具有通用性。這個選擇由你。 – Steven
這是一個很好的觀點,但是在這個特殊的例子中,它會讓代碼更簡潔,只是爲了將類型推到一個接口,當我只是需要它來解決類時,我想我已經找到了解決方案,編輯我的問題上面,看看你是否認爲它是有道理的! –
您所遇到的問題是由您的設計中的歧義造成的。你應該消除這種模糊性。例如,創建多個特定的工作接口單元,例如:'IFirstUnitOfWork','ISecondUnitOfWork'。 – Steven