2011-05-09 49 views
4

所以我認爲我會很光滑,試試這個。我需要傳遞一個上下文,而不是每次都新建一個上下文,並且能夠定義映射(實體框架) - 爲了做到這一點,我需要繼承,然後重寫DbContext類。我想保持它可以與任何背景我可以插入,所以這就是讓我這樣做。我有一個IRepository接口,在它需要一個(實體)與通常的嫌疑人,以及它與IContextFactory的依賴實現...StructureMap 2.6.1,一個紅外線庫<T>和一個EFRepository <T,TContext>

public interface IContextFactory<T> where T : DbContext 
{ 
    T Context { get; } 
} 

而且對我的「EFRepository」

public class EFRepository<T, TContext> : IRepository<T> where T : class 
     where TContext : DbContext 
{ 

    public EFRepository(IContextFactory<TContext> contextFactory) 
    { 
    } 
} 

在我的地圖中,我做了這些工作之一...

 x.For(typeof(IContextFactory<>)).Use(typeof(ContextFactory<>)); 
     x.For(typeof(IRepository<>)).Use(typeof(EFRepository<,>)); 

好酷。在我的單元測試中,我嘗試用這種方法...

 var repository = ObjectFactory.GetInstance<EFRepository<Currency, EFContext>>(); 
     var repository2 = ObjectFactory.GetInstance<IRepository<Currency>>(); 

第一個工作,沒問題。第二個,我碰到

提供的通用參數的數量不等於泛型類型定義的參數。 參數名稱:實例化

我猜這是因爲我沒有告訴結構映射哪些泛型傳遞給IRepository,因爲我傳遞2?我怎麼做? ...我可以這樣做嗎?

回答

3

這應該是可能的,但它真的很混亂......除非有人知道更好的方法。

首先您需要更改您創建EFRepository<,>的方式。使用.Use(context => ...)過載,您可以訪問像context.BuildStack.Current.RequestedType.GetGenericArguments()這樣的上下文來獲取要訪問的泛型類型。然後,您可以使用反射來新建EFRepository<,>的新實例,並從上下文中獲取IContextFactory

所以不管,像

  ObjectFactory.Configure(x => 
      { 
       x.For(typeof(IContextFactory<>)).Use(typeof(ContextFactory<>)); 
       x.For(typeof (IRepository<>)).Use(context => 
        { 
         Type arg1 = context.BuildStack.Current.RequestedType. 
          GetGenericArguments()[0]; 

         Type targetType = 
          typeof (EfRepository<,>).MakeGenericType(new[] {arg1, typeof (IContextFactory<>)}); 

         return Activator.CreateInstance(targetType, 
                 new[] {context.GetInstance(typeof (IContextFactory<>))}); 

        }); 
       //x.For(typeof(IRepository<>)).Use(typeof(EfRepository<,>)); 
      }); 

     var repository = ObjectFactory.GetInstance<EfRepository<Currency, EfContext>>(); 
     var repository2 = ObjectFactory.GetInstance<IRepository<Currency>>(); 

會得到你最的方式存在。我認爲你仍然需要正確設置targetType的第二個通用參數的泛型,然後才能工作。

+0

所以真正的答案是「這很糟糕」......我對此感到失望!我現在將這個問題留出來,但這可能是正確的答案。你說得對,它確實很糟糕。 :-( – jeriley 2011-05-10 12:20:10

相關問題