使用castle的Per-Call WCF服务的Singleton DBContext

时间:2014-02-24 15:53:45

标签: wcf entity-framework singleton castle-windsor dbcontext

我正在尝试找到一种将EF6 DbContext注入我的WCF服务的正确方法,但我很难找到一个正确的工作示例。有没有人知道每次调用WCF服务和实体框架的良好演示?我使用Castle进行注射,但欢迎任何其他IOC容器。如果您反对使用Singleton dbcontext [Massive DB],请向我展示一个性能最低的工作示例。

1 个答案:

答案 0 :(得分:0)

这对我有用: 创建具体的上下文界面:

public class CustomersContext :DbContext, ICustomerContext

然后在容器中注册为singleton

container.Register(Component.For<ICustomerContext>().ImplementedBy<CustomersContext>());

然后,您应将其注册为WCF服务并提供您自己的实例提供程序 像这样:

首先在界面中添加一些属性:

[InstanceProviderBehavior(typeof (ICustomerContext))]
[DataContract]
public class CustomersContext :DbContext, ICustomerContext

然后,编写InstanceProviderBehavior属性:

 public class InstanceProviderBehaviorAttribute : Attribute, IServiceBehavior
{
    private readonly Type _type;

    public InstanceProviderBehaviorAttribute(Type type)
    {
        _type = type;
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {

    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {

    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher ed in cd.Endpoints)
            {
                if (!ed.IsSystemEndpoint)
                {
                    ed.DispatchRuntime.InstanceProvider = new WindsorServiceInstanceProvider(_type);
                }
            }
        }
    }
}

请注意,您告诉WCF使用WindsorServiceInstanceProvider。

这是:

    public class WindsorServiceInstanceProvider : IInstanceProvider
{
    public static IWindsorContainer Container;

    private readonly Type _type;

    public WindsorServiceInstanceProvider(Type type)
    {
        _type = type;
    }

    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        return Container.Resolve(_type);
    }

    public object GetInstance(InstanceContext instanceContext)
    {
        return this.GetInstance(instanceContext, null);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
        Container.Release(instance);
    }
}

请注意名为Container的静态对象,这非常难看,但我没有找到任何其他方法将我的容器实例传递到InstanceProvider

多数民众赞成。现在,当某个客户端从您的WCF服务请求ICustomerContext时,它将从您的容器中解析它。

有关WCF实例提供程序here

的更多信息