IServiceBehavior和ApplyDispatchBehavior的简单示例

6
我正在尝试将Unity插入到一个带有服务行为的WCF服务库中。
我需要一个简单的服务行为示例。
我只想在WCF服务启动时设置我的IOC Unity容器。
注意:我没有使用WCF服务应用程序。因此,我无法访问任何ASP.NET的方法来实现这一点。从概念上讲,服务行为似乎是最优雅的方法。但我不知道如何设置它(需要哪些代码,在哪里更新配置文件等)。
1个回答

7
如果您希望控制WCF服务实例化的过程,您需要使用服务行为来插入一个IInstanceProvider。您可以在以下链接中找到一个简单的提供程序实现(针对IoC容器):http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/31/wcf-extensibility-iinstanceprovider.aspx
根据评论,如果您只需要一个简单的IServiceBehavior,这里提供了一个示例实现。
public class StackOverflow_6539963
{
    public class MyServiceBehaviorAttribute : Attribute, IServiceBehavior
    {
        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            Console.WriteLine("In MyServiceBehaviorAttribute.ApplyDispatchBehavior");
            // do whatever initialization you need
        }

        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
        }
    }
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        string Echo(string text);
    }
    [MyServiceBehavior]
    public class Service : ITest
    {
        public string Echo(string text)
        {
            return text;
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
        host.Open();
        Console.WriteLine("Host opened");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}

除非我猜错了,这是一种测试WCF服务的方法。因此,它会在每次“实例”创建时触发(IInstanceProvider)。我需要一种在启动时只触发一次的方法。我现在其实对WCF服务并不感兴趣。我只是想能够在启动时初始化我的IOC容器(但将用于我的业务层对象,而不是WCF服务对象)。 - Vaccano
1
我明白了。您的服务是托管在IIS上吗(即使用.svc文件)?如果是这样,您仍然可以连接到global.asax Application_Start。如果您没有在IIS上托管它(即您自己托管它),那么您可以在启动服务主机之前初始化IoC。 - carlosfigueira
两种方法都可以。但是,我需要能够在不同主机上运行。(我的框架团队正在为我的服务寻找托管解决方案)。因此,我正在寻找一个可用的WCF解决方案。我发现了IServiceBehavior和ApplyDispatchBehavior的相关信息,这似乎可以实现我的要求,但是找到示例很难。 - Vaccano
1
好的,我发布了一个关于IServiceBehavior的简单示例。如果您想获取更多相关信息,可以访问http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/22/wcf-extensibility-iservicebehavior.aspx。 - carlosfigueira
Service的属性被赋值为MyServiceBehavior。我在你的代码示例中没有看到MyServiceBehavior类。这个属性应该是MyServiceBehaviourAttribute,还是我在这里漏掉了什么重要的东西? - Sandy
在应用属性到目标时,C#允许您省略类名中的“Attribute”后缀。因此,使用[MyServiceBehaviorAttribute] public class Service ...[MyServiceBehavior] public class Service ...本质上是相同的。 - carlosfigueira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接