2013-07-23 90 views
0

我是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構造正確

感覺並不完美,但我覺得這適合我的需要...

+1

如果接口不是通用的,那麼StructureMap如何才能找到'TContext'類型參數中'填充'的類型?您必須通過明確註冊它的封閉版本來提供該類型,或者使該接口具有通用性。這個選擇由你。 – Steven

+0

這是一個很好的觀點,但是在這個特殊的例子中,它會讓代碼更簡潔,只是爲了將類型推到一個接口,當我只是需要它來解決類時,我想我已經找到了解決方案,編輯我的問題上面,看看你是否認爲它是有道理的! –

+0

您所遇到的問題是由您的設計中的歧義造成的。你應該消除這種模糊性。例如,創建多個特定的工作接口單元,例如:'IFirstUnitOfWork','ISecondUnitOfWork'。 – Steven

回答

2

我不能完全肯定我理解你想要什麼,但如果你讓通用在IUnitOfWork接口,那麼你可以這樣註冊:

​​

和StructureMap將與提供實現類正確的類型。這是否讓你有需要?

+0

不是我需要的東西,但是這將在未來對我有用,我想! –