Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将spring.net注入到方法中?_C#_Asp.net_Inversion Of Control_Spring.net_Dep - Fatal编程技术网

C# 如何将spring.net注入到方法中?

C# 如何将spring.net注入到方法中?,c#,asp.net,inversion-of-control,spring.net,dep,C#,Asp.net,Inversion Of Control,Spring.net,Dep,我在spring.net论坛上发布了以下内容,但也希望能在这里获得一些有价值的观点: 我正在寻找一些关于如何达到以下要求的建议 首先是一些背景知识-我正在使用Spring.NET实现IOC depdenecny注入到我的asp.NET c#多层web应用程序中。注入是通过spring.net xml配置文件实现的,我的所有开发都是通过针对接口进行开发并在需要时注入接口实现的类来实现的。这一切对我来说都很好。我相信我的知识是中等水平的 我遇到了这个问题,希望找到解决办法 举个例子,我有一个类,其中

我在spring.net论坛上发布了以下内容,但也希望能在这里获得一些有价值的观点:

我正在寻找一些关于如何达到以下要求的建议

首先是一些背景知识-我正在使用Spring.NET实现IOC depdenecny注入到我的asp.NET c#多层web应用程序中。注入是通过spring.net xml配置文件实现的,我的所有开发都是通过针对接口进行开发并在需要时注入接口实现的类来实现的。这一切对我来说都很好。我相信我的知识是中等水平的

我遇到了这个问题,希望找到解决办法

举个例子,我有一个类,其中有几个方法,它们都从数据库中检索,数据被缓存一段时间

我希望能够自由地向每个方法中注入缓存的特性,例如,它在缓存中生存的时间等。因此,我希望能够向方法中注入值,而不是在类中注入所需的值

我可以采用为每个方法在类上创建属性的方法,但这会带来麻烦,或者将设置注入到我的类中。我的偏好是通过spring注入控制每种方法

因此,任何关于如何实现这一点的想法,我都认为是其他人可能遇到过的

我提出的一个可能的想法是,通过spring向每个方法注入一个属性,该属性的属性具有方法中所需的值,例如缓存持续时间等。这是一个可行的解决方案吗?如果是这样的话,有谁能帮我配置这样的系统吗


或者,如果有人有其他想法,那就太好了。

您可以尝试使用。您可以在运行时更改方法参数。

如果采用bbaia的方法,它可能类似于下面的示例。 这有点简单,但你可以把它应用到你的情况。 假设我们有一个接口,
idoworksometime
,带有一个参数
time

public interface IDoWorkForSomeTime
{
    void Work(int time);
}
它由
TimeBoundWorker
AdvisedTimeBoundWorker
实现:

public class TimeBoundWorker : IDoWorkForSomeTime
{
    public void Work(int time)
    {
        Console.WriteLine("Working for {0} hours", time);
    }
}

public class AdvisedTimeBoundWorker : IDoWorkForSomeTime
{
    /* *** Note The Attribute *** */
    [ChangeParameter]
    public void Work(int time)
    {
        Console.WriteLine("Working for {0} hours", time);
    }
}
然后我们可以配置AOP代理在运行时更改时间参数, 因此,当我们运行以下程序时:

class Program
{
    static void Main(string[] args)
    {
        IApplicationContext ctx = new XmlApplicationContext("objects.xml");
        var worker = (IDoWorkForSomeTime)ctx.GetObject("plainWorker");
        var advisedWorker = (IDoWorkForSomeTime)ctx.GetObject("advisedWorker");

        worker.Work(4);
        advisedWorker.Work(4);
    }
}
它输出:

工作4小时
工作8小时
因此,尽管我用值4调用它,
advisedWorker
使用我在spring配置文件中配置的值8。spring容器看到
[ChangeParameter]
属性,并从我的配置中知道它必须应用以下方法拦截器:

public class ChangeParamInterceptor : IMethodInterceptor
{
    public int NewValue { get; set; }  // set in spring cofig

    public object Invoke(IMethodInvocation invocation)
    {
        invocation.Arguments[0] = NewValue; // change the argument
        object rval = invocation.Proceed();
        return rval;
    }
}
它需要在
objects.xml
中使用此spring配置:


对于配置AOP和应用建议,您有更多的选项,例如
ChangeParamInterceptor
。阅读更多的文章