2011-05-04 56 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