¿Existe una forma correcta / adecuada de resolver el problema del bucle de inyección de dependencia en el tutorial de ASP.NET MVC ContactsManager?

Si no sabes de lo que estoy hablando, pasa porel tutorial e intente agregar la inyección de dependencia usted mismo o pruebe su suerte con mi explicación del problema.

Nota: Este problema no está dentro del alcance del tutorial original en ASP.NET. El tutorial solo sugiere que los patrones utilizados son compatibles con la inyección de dependencia.

El problema es básicamente que hay un bucle de dependencia entre el Controlador, el ModelStateWrapper y el ContactManagerService.

El agente ContactController toma un IContactManagerService.El constructor ContactManagerService toma un IContactManagerRepository(no importante) y un discurso de invalidación.(que implementa ModelStateWrapper).El constructor ModelStateWrapper toma un ModelStateDictionary(que es una propiedad llamada "ModelState" en el controlador).

Entonces, el ciclo de dependencia es el siguiente: Controlador> Servicio> ModelStateWrapper> Controlador

Si intenta agregar una inyección de dependencia a esto, fallará. Así que mi pregunta es; ¿Qué debo hacer al respecto? Otros han publicado esta pregunta, pero las respuestas son pocas, diferentes, y todas parecen un poco "hack-ish".

Mi solución actual es eliminar el IModelStateWrapper del constructor IService y agregar un método de Inicialización como este:

public class ContactController : Controller
{
    private readonly IContactService _contactService;

    public ContactController(IContactService contactService)
    {
        _contactService = contactService;
        contactService.Initialize(new ModelStateWrapper(ModelState));
    }

    //Class implementation...
}

public class ContactService : IContactService
{
    private IValidationDictionary _validationDictionary;
    private readonly IContactRepository _contactRepository;

    public ContactService(IContactRepository contactRepository)
    {
        _contactRepository = contactRepository;
    }

    private void Initialize(IValidationDictionary validationDictionary)
    {
        if(validationDictionary == null)
            throw new ArgumentNullException("validationDictionary");

        _validationDictionary = validationDictionary;
    }

    //Class implementation...
}

public class ModelStateWrapper : IValidationDictionary
{
    private readonly ModelStateDictionary _modelState;

    public ModelStateWrapper(ModelStateDictionary modelState)
    {
        _modelState = modelState;
    }

    //Class implementation...
}

Con esta construcción puedo configurar mi contenedor de unidad de esta manera:

public static void ConfigureUnityContainer()
{
    IUnityContainer container = new UnityContainer();

    // Registrations
    container.RegisterTypeInHttpRequestLifetime<IContactRepository, EntityContactRepository>();
    container.RegisterTypeInHttpRequestLifetime<IContactService, ContactService>();

    ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
}

Desafortunadamente, esto significa que el método de "Inicializar" en el servicio debe ser llamadoa mano por el constructor controlador. ¿Hay alguna manera mejor? ¿Quizás donde de alguna manera incluyo el IValidationDictionary en mi configuración de unidad? ¿Debo cambiar a otro contenedor DI? ¿Me estoy perdiendo de algo?

Respuestas a la pregunta(3)

Su respuesta a la pregunta