2016-02-05 3 views
1

Я использую Autofac, и я не мастер IoC.Зарегистрируйте несколько интерфейсов, которые имеют явную реализацию в одном экземпляре

Рассмотрим такой сценарий:

public interface IBeforeRequestTask 
{ 
    void Execute(); 
} 

public interface IAfterRequestTask 
{ 
    void Execute(); 
} 

public class TaskExecutor : IBeforeRequestTask, IAfterRequestTask 
{ 
    void IBeforeRequestTask.Execute() 
    { 
     // code 
    } 

    void IAfterRequestTask.Execute() 
    { 
     // code 
    } 
} 

Таким образом, мы имеем явные реализации. Как бы вы зарегистрировали эти интерфейсы?

Я думаю, что мы не можем сделать это:

builder.RegisterType<IBeforeRequestTask> ... 
builder.RegisterType<IAfterRequestTask> ... 

Я прочитал в Autofac Registration Docs, что мы должны зарегистрировать конкретные типы.
Аналогичный вопрос, но не лечение Autofac это одна: TinyIoC: Register multiple interfaces on a single instance

Ну, я знаю, что это может быть легко, делая 1-1 (один интерфейс на класс, затем зарегистрировать конкретный тип). Но теперь мне это интересно.
Не помню, где я видел что-то вроде кода ниже, используя StructureMap (может быть неправильно):

action.AddTypesOf<IBeforeRequestTask>(); 
action.AddTypesOf<IAfterRequestTask>(); 

Надежда Я ясно. Спасибо вам всем.

EDIT
Я создал this образец, чтобы помочь. ;-)

+0

Я не совсем понимаю вопрос. Доступ к членам, использующим интерфейс, осуществляется одинаково, независимо от того, неявно или явно ли они реализованы в действительном типе. Вы заметили разницу или это упреждающий вопрос «давайте выясним это, прежде чем мы начнем это делать»? –

+1

См. [«Если вопросы включают« теги »в их названиях?»] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! –

+0

Спасибо @AndreasNiedermair ... :-) - Молодец. И я узнал. +1 для обучения правильному пути задавать вопросы (я только читаю, что появляется, когда я печатаю вопрос, такие вещи, как похожие вопросы и т. Д.). –

ответ

1

Я не совсем уверен, чего вы хотите достичь, но если вы хотите, зарегистрируйте один класс, который будет доступен в контейнере под двумя интерфейсами, и вы хотите иметь один его экземпляр, вы можете сделать это как это ,

builder.RegisterType<TaskExecutor>().As<IBeforeRequestTask>().As<IAfterRequestTask>().SingleInstance(); 
+0

На самом деле это работает! Моя реализация была неправильной! Спасибо. –

Смежные вопросы