У меня есть 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());
}