2011-06-22 67 views
1

我想与我的WCF数据服务(OData)使用Unity。我有代码看起来像这样:(无论是真实的PatientRepository或伪造的一个,我使用的测试)统一和OData(WCF数据服务)

public class PatientService : DataService<IPatientRepository> 

我想团结注入了IPatientRepository在运行时正确的对象

我有完成:

IUnityContainer container = new UnityContainer(); 
container.RegisterType<IPatientRepository, MyEntities>(); 

但是当我运行我得到:

服务器遇到错误处理请求。异常消息是'无法创建数据提供者。在'PatientService.PatientService'中为数据源输入'RepositoryInterfaces.IPatientRepository'是抽象的。'

有没有办法注入这种依赖性?或者我必须把真正的课程放在那个地方?

回答

0

WCF Data Services不知道你的容器,因此不能调用它来找出你传递的接口的实现。

同样,您的Container可以执行构造函数注入,但不能在DataService中动态指定T <T>。

所以据我所知,没有办法使用DataService与接口,然后注入一个实现。

编辑:我应该工作,因为维特克在评论中指出的,是只申报类数据源<牛逼>与接口,然后重写的createDataSource()方法。在这种方法中,你可以再做一个服务定位器调用IYourInterface执行:

var myService = ServiceLocator.Get<IYourInterface>(); 

当然,这需要您配置容器服务位置。

模式&实践组显然已实施服务定位器模式的Unity适配器,请参阅http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home&ProjectName=commonservicelocator

有关服务定位器模式的更多信息,请参阅http://msdn.microsoft.com/en-us/library/ff648968.aspx

+0

您可以定义DataService ,其中T是一个接口。但是,你必须重写CreateDataSource方法并实例化上下文类(实现该接口)。不知道这是否会与注射一起工作。 –

+0

@Vitek:也许如果你重写CreateDataSource,然后在覆盖中使用ServiceLocator?这可能会起作用。 –

+0

尽量避免使用ServiceLocator,请尽量不要使用ServiceLocator。这是一种反模式,如本文所述http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/由Mark Seemann撰写,他是Microsoft Patterns and Practices的ServiceLocator类的原始开发人员。他出于充分的理由马上离开了。 –

1

此处不应使用ServiceLocator类和ServiceLocator (anti)pattern。下面的代码看起来像是服务定位器(反)模式,但它不完全。

CreateDataSource方法是我发现组成对象图的请求生命周期中最早的一点。这里,它被用作组合根。 Bootstrapper是一个帮助类,它调用Unity配置,无论它是从XML还是代码加载它。

public class PatientService : DataService<IPatientRepository> 
{ 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     // TODO: set rules to indicate which entity sets and service 
      operations are visible, updatable, etc. 
      ... 
    } 

    [WebGet] 
    public IQueryable<Patient> Patients() 
    { 
     return from p in CurrentDataSource.Patients select p; 
    } 

    protected override IPatientRepository CreateDataSource() 
    { 
     IUnityContainer container = new UnityContainer(); 
     Bootstrapper.Initialise(container); 
     return container.Resolve<IPatientRepository>(); 
    } 
} 

因此@Roy指向CreateDataSource()方法是正确的。但是应该避免使用ServiceLocator作为类或模式。不幸的是,微软几乎强迫每个人都通过ServiceLocator和DependencyResolver等类来强制ServiceLocator路由。

+0

'DataService '泛型类型'T'并不是一个接口,要么与'CreateDataSource()'方法一起工作。 –