Внедрение и разрешение сервисного стека в фильтре (dot net core 2) - PullRequest
0 голосов
/ 26 июня 2018

У меня есть TypeFilterAtrribute, который создает экземпляр и ActionFilter.Для ActionFilter нужны две службы.

 public class ValidateUserAttribute : TypeFilterAttribute
{
    public ValidateUserAttribute() : base(typeof(AuthenticationFilter))
    {
    }


    private class AuthenticationFilter : ActionFilterAttribute
    {
        private readonly IActiveDirectoryService ActiveDirectoryService;
        private readonly MessageService MessageSerivce;
        public AuthenticationFilter(IActiveDirectoryService activeDirectoryService, MessageService messageSerivce)
        {
            ActiveDirectoryService = activeDirectoryService;
            MessageSerivce = messageSerivce;
        }

У меня есть работа с контейнером IOC по умолчанию для dot dot core 2, но я не могу использовать контейнер Funq для этого.

Я читаюиз appsettings.json (я думаю, что я читал в документации, ServiceStack не поддерживает это) и регистрации

 var config = Configuration.GetSection("LdapAuth");
 services.Configure<LdapAuthenticationOptions>(Configuration.GetSection("LdapAuth"));
 services.AddActiveDirectoryService(options =>
            Configuration.GetSection("LdapAuth"));//uses collection.AddTransient<IActiveDirectoryService, ActiveDirectoryService>()
services.AddMessageService(); //same as above 

Я не могу придумать, как внедрить в фильтр параметризованный сервис.

Так что это вообще не работает, потому что у меня нет конструктора по умолчанию.

public class AuthenticationFilter : ActionFilterAttribute
{
public IActiveDirectoryService ActiveDirectoryService {get; set;};

Но это, по крайней мере, должно сработать.Я не использую интерфейс здесь, хотя.открытый класс AuthenticationFilter: ActionFilterAttribute {public MessageService MessageService {get;задавать};// заметим, что здесь не используется интерфейс, хотя это как конструктор по умолчанию.

Когда это становится действительно уродливым, у меня есть контроллеры, которые наследуют ServiceStackController и я внедряю сервисы, используя ResolveService из контейнера Funq.

  public class MessageController : ServiceStackController
{
...
var messageService = ResolveService<MessageService>()

Я перерегистрирую их .. как показано ниже.

  public override void Configure(Funq.Container container)
    {
        SqlServerDialect.Provider.RegisterConverter<TimeSpan>(new ServiceStack.OrmLite.SqlServer.Converters.SqlServerTimeConverter
        {
            Precision = 7
        });

        var connectionString = GetConnectionString(AppSettings);

        container.Register<IDbConnectionFactory>(
            new OrmLiteConnectionFactory(connectionString, new SqlServerOrmLiteDialectProvider()));

        LdapAuthenticationOptions options = GetLdapAuthenticationOptions(AppSettings); //notice now I have to read from AppSetting.. which is appsettings.txt file.

        container.Register(c => new ActiveDirectoryService(options));
        container.Register(c => new MessageService());
    }
...