2011-09-10 63 views
0

我有一個類,RepositoryManager,而我在我的一些控制器的使用這個類:與構造StructureMap容器​​參數

public RepositoryManager 
{ 
    public IGenericRepository Repository {get; set;} 

    public RepositoryManager() 
    { 
     Repository = new GenericRepository(new MyEntities()); 
    } 

    //... 
} 

我想IGenericRepository移動到StructureMapInversion of control(IOC)容器

x.For<IGenericRepository>().Use<GenericRepository>().Ctor<MyEntities>("MyEntities"); 

然後我改變我的類的構造函數是:

public RepositoryManager(IGenericRepository repository) 
{ 
    Repository = repository; 
} 

但注射不起作用。我也嘗試使用Repository上的[SetterProperty]屬性,但仍然沒有實例化Repository。

我做錯了什麼?

我的完整的IoC初始化:

public static class IoC { 
    public static IContainer Initialize() { 
     ObjectFactory.Initialize(x => 
      { 
       x.Scan(scan => 
        { 
         scan.TheCallingAssembly(); 
         scan.WithDefaultConventions(); 
        }); 
       x.For<IRepositoryManager>().Use<RepositoryManager>(); 
       x.For<IGenericRepository>().Use<GenericRepository>().Ctor<MyEntities>("MyEntities"); 
      }); 
     return ObjectFactory.Container; 
    } 
} 
+0

FYI(無關你的問題),的ObjectFactory已經作爲靜態網關,所以沒有必要將其包裝在您自己的IoC靜態類中。如果你仍然喜歡你自己的靜態類,那麼沒有理由使用StructureMaps - 只需創建一個新的Container實例,並將初始化塊傳遞給它的構造函數。從你的Initialize方法返回。 –

回答

0

基本上你的IoC初始化是錯誤的IGenericRepository。將其更改爲:

x.For<IGenericRepository>().Use(() => new GenericRepository(new MyEntities())); 

在這種情況下,參數MyEntities構造函數將被調用和MyEntities一個實例將被創建並傳遞給構造函數的參數。

0

您不需要註冊具體類型;它們將僅由StructureMap解決。掃描儀已與默認的約定使用,所以在上面的例子中下面的註冊碼是完全足夠了:

ObjectFactory.Initialize(x => x.Scan(scanner => 
    { 
     scanner.TheCallingAssembly(); 
     scanner.WithDefaultConventions(); 
    }));