过滤器中的服务堆栈注入和解析服务(点网核心2)

时间:2018-06-25 23:49:55

标签: asp.net-core filter dependency-injection

我有一个实例化的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;
        }

我可以使用点网核心2的默认IOC容器工作,但是我无法使用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     {     公共MessageService MessageService {get;组}; //注意,尽管这是默认的构造方法,但这里不使用接口。

这变得很难看的地方是,我拥有继承ServiceStackController的控制器,并使用Funq容器中的ResolveService注入了服务。

  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());
    }

0 个答案:

没有答案