Ninject Convention в реализации нескольких интерфейсов - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть несколько интерфейсов

public interface IViewModelBuilder<in TView> 
{
    void Build(TView model);
}

public interface IViewModelBuilder<in TInput, out TView>
{
    TView Build(TInput input);
}

public interface IViewModelSaver<in TService, in TView>
{
    //bool Save(TView model);
    void Save<T>(TView model) where T: TService;
}

, и реализация этих интерфейсов

public class SummaryViewModelBuilder : 
    IViewModelBuilder<SummaryViewModel>
    , IViewModelSaver<ICustomerQueryService, SummaryViewModel>
    , IViewModelSaver<ISmallBussinessService, SummaryViewModel>
{
    public void Build(SummaryViewModel model)
    {
        model.Status = "Done " + model.ResellerId;
    }

    void IViewModelSaver<ICustomerQueryService, SummaryViewModel>.Save<T>(SummaryViewModel model)
    {
        Console.WriteLine("ICustomerQueryService");
    }

    void IViewModelSaver<ISmallBussinessService, SummaryViewModel>.Save<T>(SummaryViewModel model)
    {
        Console.WriteLine("ISmallBussinessService");
    }
}

прекрасно работает с соглашениями Ninject, такими как

kernel.Bind(x =>
                x.FromThisAssembly().SelectAllClasses().InheritedFrom(typeof(IViewModelBuilder<>))
                    .BindSingleInterface());

kernel.Bind(x =>
            x.FromThisAssembly().SelectAllClasses().InheritedFrom(typeof(IViewModelBuilder<,>))
                .BindSingleInterface());

kernel.Bind(x =>
            x.FromThisAssembly().SelectAllClasses().InheritedFrom(typeof(IViewModelSaver<,>))
                .BindSingleInterface());

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

...