2010-01-26 10 views
1

我想攔截在SM中創建一個實例,我正在嘗試以下,但它不調用InstanceInterceptor實現,有誰知道爲什麼嗎?StructureMap InstanceInterceptor不被調用

ForRequestedType<IPublishResources>() 
.TheDefault 
.Is 
.OfConcreteType<PublisherService>() 
.InterceptWith(new PublisherServiceInterceptor()); 

測試代碼使用的ObjectFactory創建實例,並顯示如下:

// Given we have a configure object factory in StructureMap... 
ObjectFactory.Configure(x => x.AddRegistry(new StructureMapServiceRegistry())); 

// When we request a publisher service... 
var publisher = ObjectFactory.GetInstance<IPublishResources>(); 

乾杯

AWC

回答

2

我不能在2.5.4版本重現您的問題。這是我的代碼。

public interface IPublishResources {} 
class PublishResources : IPublishResources {} 
public class LoggingInterceptor : InstanceInterceptor 
{ 
    //this interceptor is a silly example of one 
    public object Process(object target, IContext context) 
    { 
     Console.WriteLine("Interceptor Called"); 
     return context.GetInstance<PublishResources>(); 
    } 
} 

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     For<IPublishResources>() 
      .Use<PublishResources>() 
      .InterceptWith(new LoggingInterceptor()); 
    } 
} 

[TestFixture] 
public class Structuremap_interception_configuraiton 
{ 
    [Test] 
    public void connecting_implementations() 
    { 
     var container = new Container(cfg => 
     { 
      cfg.AddRegistry<MyRegistry>(); 
     }); 

     container.GetInstance<IPublishResources>(); 
    } 
} 

有問題。你真的需要在這裏使用Interceptor嗎?如果你只需要定義一個工廠,你可以做這樣的事情。

public interface IPublishResourcesFactory 
{ 
    IPublishResources Create(); 
} 

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     For<IPublishResources>().Use(c => 
     { 
      return c.GetInstance<IPublishResourcesFactory>().Create(); 
     }); 

     //or 

     For<IPublishResources>().Use(c => 
     { 
      //other object building code. 
      return new PublishResources(); 
     }); 
    } 
} 
+0

Ia格力與你我實際上並不需要它,並已經改變了代碼 - 謝謝你的信息,但... – AwkwardCoder 2010-02-01 16:01:17