Autofac Родительский класс и дочерний класс, реализующие один и тот же интерфейс - PullRequest
0 голосов
/ 19 ноября 2018

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

Как мне написать файл начальной загрузки AutoFac для разрешения EmailNotifier?

Когда я пытаюсь решить, я получаю ошибку циклической зависимости.Ниже приведен код.Я уже пробовал builder.RegisterAssemblyTypes это приносит только дочерняя реализация

   using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autofac;

namespace AutoFactTest
{
    // This interface lets you send some content
    // to a specified destination.
    public interface ISender
    {
        string Send(string message);
    }

    // We can implement the interface for different
    // "sending strategies":
    public class PostalServiceSender : ISender
    {
        public string Send(string message)
        {
            return message;
        }
    }
    public class EmailNotifier : ISender
    {
        ISender _postal;

        public EmailNotifier(ISender postal)
        {
            _postal = postal;
        }
        public string Send(string message)
        {
            return "EMail " + message;
        }

        public string DoSomethingElse(string message)
        {
            return "Do Something Else with " + Send(message);
        }
    }

    public class PostalModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<PostalServiceSender>().AsSelf().As<ISender>().InstancePerDependency();
        }
    }

    public class EmailModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterModule<PostalModule>();
            builder.RegisterType<EmailNotifier>().AsSelf().As<ISender>().InstancePerDependency();
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            builder.RegisterModule<EmailModule>();
    //This doesn't work because it takes only child implementation
  //          builder.RegisterAssemblyTypes(typeof(EmailNotifier).Assembly)
  //.Where(x => x.Name.EndsWith("Sender"))
  //.AsImplementedInterfaces();
            var container = builder.Build();

           ISender  sender = container.Resolve<ISender>();
           var output =  container.Resolve<EmailNotifier>(new Autofac.NamedParameter("postal", sender));
        }
    }
}
...