2011-05-04 53 views
1

我正在創建一個範圍爲HTTPContextScoped的類型的實例。我想弄清楚如何將這個特定的實例注入到一個屬性中,而這個屬性我沒有控制權。安裝程序注入與結構映射的問題

我想的UnitOfWork具體實例注入在屬性IUnitOfWork類型的財產(見下文代碼)

這裏是我的ObjectFactory.Initialize()部分的方法我指的是:

ObjectFactory.Initialize(x => 
{ 
    //... 
    //additional content 
    //... 

    x.For<IUnitOfWork>() 
     .HttpContextScoped() 
     .Use(context => new UnitOfWork(
      context.GetInstance<ISessionFactory>())); 

    x.SetAllProperties(context => 
    { 
     context.Matching(p => 
      p.DeclaringType == typeof(UnitOfWorkAttribute)); 
     context.OfType<IUnitOfWork>(); 
    }); 

屬性類:

public class UnitOfWorkAttribute : ActionFilterAttribute { 

    public IUnitOfWork UnitOfWork { get; set; } 

    public UnitOfWorkAttribute() { 
     Order = 0; 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) { 
     UnitOfWork.Begin(); 
    } 

    public void OnActionExecuted(ActionExecutedContext filterContext) { 
     UnitOfWork.End(); 
    } 
} 

我試圖按照Jeremy Miller的一個使用標準的例子來做,但我沒有做正確的事情。

任何想法我做錯了什麼?

注意它不會創造,因爲我用它在其他地方的實例的UnitOfWork,但我特別不正確(或全部)注入該屬性的屬性與該實例(或任何爲此事)。

+0

你不能在屬性上使用依賴注入,因爲屬性是由.NET框架創建和控制的,如果你顯示了一些你正在做的事情(比如你的'UnitOfWorkAttribute'的代碼)我們可能會有一個替代解決方案 – Steven 2011-05-04 13:20:28

+0

@Steven:我用完整的代碼更新了UnitOfWorkAttibute類,但是,儘管你根據這個http://groups.google.com/group/structuremap-users/browse_thread/thread/f5d2ca90dae4017e/0323e2175a3ec020?lnk=raot&pli=1帖子(傑里米米勒回答),這張海報試圖完成幾乎相同的事情有他無法訪問的情況,Jeremy似乎表明這是可能的。 – pghtech 2011-05-04 13:37:30

+0

據我所知,鏈接到的線程沒有提及屬性。您想要在屬性中注入屬性。 – Steven 2011-05-04 13:45:55

回答

1

嘗試通過爲IUnitOfWork對象創建工廠來解決此問題。由於工作的情況下,必須explicly控制單元的壽命(因爲你正在做BeginEnd,控制他們自己是更合乎邏輯,堅持了principle of least surprise

這裏是你可以做什麼一個例子:

public interface IUnitOfWorkFactory 
{ 
    IUnitOfWork NewUnitOfWork(); 
} 

public class MyController : Controller 
{ 
    private readonly IUnitOfWorkFactory factory; 

    public MyController(IUnitOfWorkFactory factory) 
    { 
     this.factory = factory; 
    } 

    public void Operation() 
    { 
     using (var work = new this.factory.NewUnitOfWork()) 
     { 
      work.Begin(); 

      // do some interesting stuff here.    

      work.End(); 
     } 
    } 
} 
+0

使用OnActionExecuting和OnActionExecuted方法的屬性的使用我可以保持我的代碼更清潔。另外,由於Structuremap已經創建了IUnitOfWork的一個實例,所以我不會直接將它注入到控制器中,也不需要擁有Factory的開銷,同時讓StructureMap處理對象的生命期。 – pghtech 2011-05-04 14:25:16