gpt4 book ai didi

java - 使用依赖注入(inject)实现数据访问 API

转载 作者:行者123 更新时间:2023-12-04 05:28:04 25 4
gpt4 key购买 nike

我是编写 API 的新手,做了一些研究并意识到要完成我想要的事情,我需要使用依赖注入(inject)来完成它。我正在编写一个具有两个数据源的 android 应用程序。一种是通过 Web 服务公开,另一种是 SQLlite。 SQLlite 在没有数据连接可用时用作备份(暂时只对 API 的 webservice 部分感兴趣会重构)。我想编写一个 API,为其提供一个抽象层,根据所需的模型调用正确的数据访问类。因此,我有一个描述 api 应该实现的方法的接口(interface),称为 IDataAccess(仅对 getAll 感兴趣,目的是弄清楚要做什么)。

public interface IDataAccess {  
public <T> List <T> getAll ();
public <T> T getById (int id);
}//end IDataAccess

我正在使用 Guice 进行依赖注入(inject)。 guice 模块是:
public class Data extends AbstractModule {
public void configure () {
bind (IDataAccess.class).to(UserData.class);
}
}

IDataAccess 的实现是(注意我使用的是 Jersey 客户端 API):
public class UserData extends DataAccessManager implements IDataAccess {    
@SuppressWarnings("unchecked")
public List <User> getAll () {
WebResource webResource = client.resource (WebResourceURL.URL_USER_ALL);
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
if (response.getStatus () == 200)
return response.getEntity(new GenericType <List <User>> () {}) ;
else
return null;
}//end getAllUsers method
}

我有一个类可以加载和实例化所需的任何资源。它还返回一个名为 DataAccessFactory 的 DataManager 实例。
public class DataAccessFactory {
private Client client;
private static DataAccessFactory instance;
private DataAccessFactory() {
client = Client.create();
}
public static DataAccessFactory getInstance() {
/*
* check if instance variable is instantiated.
* if it is not then instantiated it and returns
* created instance.
*/
if (instance == null) {
instance = new DataAccessFactory();
return instance;
} else
return instance;
}//end getInstance method
public DataAccessManager createDataAccessManager() {
return new DataAccessManager(client);
}//end createDataAccessManager method
}

然后我有实际的 DataAccessManager 类:
public class DataAccessManager {
protected Client client;
protected DataAccessManager (Client client)n{
this.client = client;
}//end constructor
public <T> List <Object> getAll(T t) {
Data module = new Data ();
Injector injector = Guice.createInjector(module);
IDataAccess data = (IDataAccess) injector.getInstance(t.getClass());
return (List<Object>) data;
}//end fetchAllUser method
}

要在此类上调用用户模型,我会执行以下操作:
@Test
public void fetchUser () {
DataAccessManager m = DataAccessFactory.getInstance().createDataAccessManager();
List<User> user = (List<User>) m.getAll(new Userdata ());
if (user == null)
assertEquals(1, 2);
else
assertEquals(1, 1);
}

理想情况下,我现在想要做的是,调用 UserData 来获取所有 User 对象或 OrderData(在编写实现时)类来获取所有订单对象等。

问题是这给出了一个错误:

Cannot cast from List to List



.我怎样才能解决这个问题或重组它以使其有意义?

最佳答案

1) 您正在为每个请求创建一个注入(inject)器 (Guice.createInjector)。注入(inject)器的创建很昂贵,通常应该在应用程序加载期间完成。您应该将 DI 视为一种引导机制并保持简单。

2) 您不需要 DataAccessFactory。首先不需要工厂,因为 createDataAccessManager 实例化不需要任何逻辑,其次 Guice 也可以处理工厂模式。

我个人会保持简单,直接用 Guice 注入(inject) UserData实例到需要它的每个服务中,而不使用此处显示的相当复杂的抽象方法。尽管如此,它并没有解决处理网络问题的问题。我的猜测是每个数据访问类都必须以特定的方式处理连接,所以逻辑应该直接在这里。

有关列表转换问题,请参阅 http://docs.oracle.com/javase/tutorial/java/generics/subtyping.html

如果您继续这样,我建议您阅读 erasure还。

关于java - 使用依赖注入(inject)实现数据访问 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com