StructureMap InstanceInterceptor не вызывается - PullRequest
1 голос
/ 26 января 2010

Я хочу перехватить создание экземпляра в SM, и я пытаюсь сделать следующее, но он не вызывает реализацию 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

1 Ответ

2 голосов
/ 01 февраля 2010

Я не смог воспроизвести вашу проблему в выпуске 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>();
    }
}

Вопрос. Вам действительно нужно использовать перехватчик здесь? Если вам нужно только определить фабрику, вы можете сделать что-то вроде этого.

    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();
        });
    }
}
...