2014-09-04 49 views
0

我有一个类作为数据库层之上的一个层,以方便数据库访问,它工作得很好。 但是现在我想要从数据库中读取的所有方法都可以异步访问,而没有任何危险的危险。所以我认为,如果我只用“read”方法实现接口,那么当从异步线程进行工作时,我可以引用该接口而不是普通类。异步方法的继承接口,最佳实践

有没有更好的(但希望相似)的方式来实现这一点?

这里是我多远尝试过的例子,但没有成功:

// My two interfaces. 
// The UserCoreManager class is the layer that works with the database 
// layer for the users table. 
// but the IUserCoreManagerAsync only reference the async friendly methods. 

public interface IUserCoreManagerAsync 
{ 
    User GetData(); 
} 

public interface ICoreAsync 
{ 
    IUserCoreManagerAsync User { get; } 
} 

到目前为止,一切都很好。通过引用ICoreAsync接口中的用户,我会理论上只能获取数据而不保存任何内容吗?

下面是我实现的接口实际类的样子:

public class UserCoreManager : IUserCoreManagerAsync 
{ 
    public User GetData() 
    { 
     ... 
    } 

    public User SetData() 
    { 
     ... 
    } 
} 

public partial class Core : ICoreAsync 
{ 
    private UserCoreManager user; 
    public UserCoreManager User // <- This is the tricky part 
    { 
     get 
     { 
      return user; 
     } 
     protected set 
     { 
      user = (UserCoreManager)value; 
     } 
    } 
} 

正如你所看到的,UserCoreManager有一个setData()方法,所以它不闯民宅太接口工作时也不会线程对我来说很安全。 但正如你也可以看到的,我没有实现接口属性返回一个IUserCoreManagerAsync,但我有点希望UserCoreManager属性可以做到这一点。

你会如何做到这一点?我的目标是要实现这样的使用这些类时:

public void DoSomeAsyncWork(ICoreAsync core) 
{ 
    var myData = core.User.GetData(); 
} 

public void DoSomeWork(Core core) 
{ 
    core.User.SetData("some data"); 
} 

这样,我有实际的同一个对象,但根据我把它送给哪些方法,我怎么投的话,他们可以强制与他们一起工作线程安全与否。

+3

你的问题实在是不清楚。 *“我希望从数据库中读取的所有方法能够异步访问,而不会冒任何危险的危险”*是什么意思?您的示例中没有显示异步行为,什么是“有些危险”? – 2014-09-04 21:30:03

+0

@ScottChamberlain:抱歉不清楚。异步行为是在这个代码的上一层完成的,但我希望Core-object是相同的,但取决于它是否在主线程上或者不是通过强制转换(在我上一个代码示例中可以看到),它们的行为有所不同。 – einord 2014-09-04 21:33:01

回答

0

检查了这一点

public interface IUserCoreMagagerWrite 
{ 
    public void SetData(User user); 
} 

public interface IUserCoreManagerRead 
{ 
    public User GetData(); 
} 

public interface IUserCoreManagerReadWrite : IUserCoreManagerRead, IUserCoreMagagerWrite 
{ 

} 

public class UserCoreManager : IUserCoreManagerReadWrite 
{ 
    public User GetData() 
    { 
     return new User("abbo"); 
    } 

    public void SetData(User user) 
    { 
     //... 
    } 
} 


public class Core 
{ 
    public IUserCoreManagerReadWrite UserCoreManager { get; set; } 
} 

public class AsyncCore 
{ 
    public IUserCoreManagerRead UserCoreManager { get; set; } 
} 

public class TheProgram 
{ 
    public void SynchronousWork() 
    { 
     Core core = new Core(); 
     User user = core.UserCoreManager.GetData(); 
     core.UserCoreManager.SetData(user); 
    } 

    public void AsyncWork() 
    { 
     AsyncCore core = new AsyncCore(); 
     User user = core.UserCoreManager.GetData(); 
    } 
} 
+0

谢谢!这是一个很好的解决方案,除了AsyncCore和Core不是同一个对象。所以,即使它通常能正常工作,我也必须在两个核上创建相同的CoreManager属性。至少它还是最好的答案=) – einord 2014-09-06 19:52:47