ServiceStack IOC没有在Attribute中注入属性(对象为null)

时间:2013-04-06 21:40:22

标签: asp.net servicestack

我正在尝试记录/保留我的所有请求/响应,并且认为我尝试使用全局属性,但是当我去实际使用repo时,它是null?这可能吗?

还有其他方法可以实现我的目标吗?

谢谢你, 斯蒂芬

属性

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class LogRequestAttribute : RequestFilterAttribute 
{
    public IRepository Repo { get; set; }

    public LogRequestAttribute(ApplyTo applyTo)
        : base(applyTo)
    {
        this.Priority = -200;
    }

    public LogRequestAttribute()
        : this(ApplyTo.All) {}

    public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
    {
        try
        {
            // Convert the req obj into something that can be persisted...

            Repo.LogRequest("Logging the rquest");
        }
        catch (Exception ex)
        {
            System.Diagnostics.Trace.TraceError(ex.ToString());
        }
    }
}

AppHost配置

public override void Configure(Container container)
{
    //Set JSON web services to return idiomatic JSON camelCase properties
    ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

    //Show StackTrace in Web Service Exceptions
    SetConfig(new EndpointHostConfig { DebugMode = true });


    //Register any dependencies you want injected into your services
    container.Register<ICacheClient>(new MemoryCacheClient());

/*            // Redis
    container.Register<IRedisClientsManager>(c => new PooledRedisClientManager());
    container.Register<IRepository>(c => new Repository(c.Resolve<IRedisClientsManager>()));*/


    container.Register<IRepository>(new Repository());
    container.Register<IBusinessService>(new BusinessService());

    //Configure Custom User Defined REST Paths for your services
    /*ConfigureServiceRoutes();*/

    //Add a request filter to check if the user has a session initialized
    /*this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
    {
        var sessionId = httpReq.GetCookieValue("user-session");
        if (sessionId == null)
        {
            httpResp.ReturnAuthRequired();
        }
    });*/


    RequestFilters.Add((httpReq, httpResp, requestDto) => new LogRequestAttribute().Execute(httpReq, httpResp, requestDto));
}

存储库

public interface IRepository
{
    void LogRequest(string request);
    void LogResponse(string request);
}

public class Repository : IRepository
{
    private static readonly ILog Log = LogManager.GetLogger("API.Repository");

    public Repository()
    {

    }

    public void LogRequest(string request)
    {
        Log.Debug(request);
    }

    public void LogResponse(string request)
    {
        Log.Debug(request);
    }
}

更新

//Add a 'global' request filter
this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
    /* Code here */
});


//Add a 'global' response filter
this.ResponseFilters.Add((httpReq, httpResp, responseDto) =>
{
    /* Code here */
});

1 个答案:

答案 0 :(得分:4)

如果您尝试在ServiceStack中记录请求,则应该查看Request Logger插件是否有用。 RequestLogsFeature Plugin允许您使用自己的自定义IRequestLogger,而不是默认使用的InMemoryRollingRequestLogger

过滤器属性

虽然你已经正确定义了一个请求过滤器属性,但你没有正确应用它,它应该像任何其他C#属性一样使用(即装饰)。只需服务类型请求DTO 或服务操作 它只运行到它们应用的范围。

全局请求过滤器

没有全局请求过滤器属性Filter Attributes只允许您指定要执行的委托,这就是这里发生的一切:

RequestFilters.Add((httpReq, httpResp, requestDto) => 
  new LogRequestAttribute().Execute(httpReq, httpResp, requestDto));

LogRequestAttribute 类型的新实例是内联构造的(如上所示,未从IOC解析),因此它不是自动连接的。您调用的方法是FilterAttribute的一个实例是无关紧要的,因为所有C#委托都在调用空的LogRequestAttribute实例上的方法。

如果在Configure()内注册全局过滤器,您可以直接访问container,例如:

RequestFilters.Add((httpReq, httpResp, requestDto) => 
  container.Resolve<IRepository>().LogRequest("Logging the request"));

在其他任何地方,您都可以使用单身人士AppHostBase.Resolve<T>()访问ServiceStack的IOC。