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