Я хочу разрешить родительский класс, который принимает дочерний класс в качестве параметра и оба реализуют один и тот же интерфейс.
Как мне написать файл начальной загрузки 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));
}
}
}