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