2012-03-21 82 views
0

我想分離我的邏輯以獲得更好的可讀性和可重用性。我正在嘗試構建更好的應用程序。在Linq/mvc4中建立和分離查詢邏輯

我會告訴你一個工作控制器和模型的樣本,並顯示我想去的地方。

這是我在轉換之前。

private IOAuthCredentials credentials = new SessionStateCredentials(); 
    private MvcAuthorizer auth; 
    private TwitterContext twitterCtx; 

public ActionResult Twitter() 
    { 



     if (credentials.ConsumerKey == null || credentials.ConsumerSecret == null) 
     { 
      credentials.ConsumerKey = ConfigurationManager.AppSettings["twitterConsumerKey"]; 
      credentials.ConsumerSecret = ConfigurationManager.AppSettings["twitterConsumerSecret"]; 
      credentials.OAuthToken = ConfigurationManager.AppSettings["twitterOAuthToken"]; 
      credentials.AccessToken = ConfigurationManager.AppSettings["twitterAccessToken"]; 
     } 

    auth = new MvcAuthorizer 
     { 
      Credentials = credentials 
     }; 

     auth.CompleteAuthorization(Request.Url); 

     if (!auth.IsAuthorized) 
     { 
      Uri specialUri = new Uri(Request.Url.ToString()); 
      return auth.BeginAuthorization(specialUri); 
     } 





       twitterCtx = new TwitterContext(auth); 

       List<TweetViewModel> friendTweets = (from tweet in twitterCtx.Status 
                 where tweet.Type == StatusType.Friends 
                select new TweetViewModel 
                { 
                 ImageUrl = tweet.User.ProfileImageUrl, 
                  ScreenName = tweet.User.Identifier.ScreenName, 
                  Tweet = tweet.Text 
                 }) 
     .ToList(); 

    return View(friendTweets); 

這裏是

public class TweetViewModel 
{ 
    /// <summary> 
    /// User's avatar 
    /// </summary> 
    public string ImageUrl { get; set; } 

    /// <summary> 
    /// User's Twitter name 
    /// </summary> 
    public string ScreenName { get; set; } 

    /// <summary> 
    /// Text containing user's tweet 
    /// </summary> 
    public string Tweet { get; set; } 
} 

我做了一個DataContext文件夾,並把數據類中

這裏是類

public class TwitterFriend 
    { 
    private MvcAuthorizer auth; 
    public List<TweetViewModel> GetFriends() 
    { 

     // private MvcAuthorizer auth; 
     using (var twitterCtx = new TwitterContext(auth)) 
     { 

      var friendTweets = (from tweet in twitterCtx.Status 
               where tweet.Type == StatusType.Friends 
               select new TweetViewModel 
               { 
                ImageUrl = tweet.User.ProfileImageUrl, 
                ScreenName = tweet.User.Identifier.ScreenName, 
                Tweet = tweet.Text 
               }) 
      .ToList(); 

      return friendTweets; 
     } 
    } 

然後我試圖做一個列表中的類方法來實例化列表(不起作用)

public List<TweetViewModel> GetFriendTweets() 
    { 
     List<TweetViewModel> friends = (List<TweetViewModel>)(new TwitterFriend()); 
     // friends.ToList(); 

     return friends.ToList(); 
    } 
} 

然後我會把從方法

Getfriends()拉列表:

很抱歉,如果我粘貼的東西很多,我試圖設計並作出適當的應用,在那裏我沒有重新執行我的邏輯,因爲我知道我可以擊中這些陷阱。

我可以得到一些解決此問題的幫助。我不認爲這是一個複雜的情況。

如果他們需要幫助,修改後的答案在下面!謝謝!!

就在數據類

 public List<TweetViewModel> GetFriends() 
     // public List<Status> GetFriends() 
     { 
     using (var twitterCtx = new TwitterContext(_auth)) 
     { 


      // List<Type> 
      List<Status> friendTweets = (from tweet in twitterCtx.Status 
             where tweet.Type == StatusType.Friends 
             select tweet).ToList(); 

      List<TweetViewModel> friends = new List<TweetViewModel>();    

      foreach (Status item in friendTweets) 
      { 
       TweetViewModel search2 = new TweetViewModel(); 
       { 
        search2.ImageUrl = item.User.ProfileImageUrl; 
        search2.ScreenName = item.User.Identifier.ScreenName; 
        search2.Tweet = item.Text; 
       } 
      friends.Add(search2); 
      } 


      return friends.ToList(); 
+0

在初始化你的'MvcAuthorizer'對象中的一部分。在「TwitterFriend」類中,它不是。 – veblock 2012-03-22 03:22:20

回答

0

添加一個構造函數,你注入MVC​​Authorizer Twitter的友元類。

公共類TwitterFriendService {

private readonly MvcAuthorizer _auth; 
public TwitterFriend(MvcAuthorizer auth){ 

_auth = auth; 
} 

公共列表GetFriends() {

using (var twitterCtx = new TwitterContext(_auth)) 
    { 

VAR friendTweets =(從鳴叫在twitterCtx.Status 其中tweet.Type == StatusType.Friends 選擇新的TweetViewModel { ImageUrl = tweet.User.ProfileImageUrl, ScreenName = tweet.User.Identifier.ScreenName, Tweet = tweet.Text }) 。ToList();

return friendTweets; 
} 

}

,然後在控制器上:

private IOAuthCredentials credentials = new SessionStateCredentials(); 
    private MvcAuthorizer auth; 
    private TwitterContext twitterCtx; 

public ActionResult Twitter() 
    { 



     if (credentials.ConsumerKey == null || credentials.ConsumerSecret == null) 
     { 
      credentials.ConsumerKey = ConfigurationManager.AppSettings["twitterConsumerKey"]; 
      credentials.ConsumerSecret = ConfigurationManager.AppSettings["twitterConsumerSecret"]; 
      credentials.OAuthToken = ConfigurationManager.AppSettings["twitterOAuthToken"]; 
      credentials.AccessToken = ConfigurationManager.AppSettings["twitterAccessToken"]; 
     } 

    auth = new MvcAuthorizer 
     { 
      Credentials = credentials 
     }; 

     auth.CompleteAuthorization(Request.Url); 

     if (!auth.IsAuthorized) 
     { 
      Uri specialUri = new Uri(Request.Url.ToString()); 
      return auth.BeginAuthorization(specialUri); 
     } 



    TwitterFriendService twitterFriendService = new TwitterFriendService(auth); 
    List<TweetViewModel> friendTweets = twitterFriendService.GetFriends(); 

     return View(friendTweets); 

}

希望這有助於

+0

非常感謝您,我在服務上下文中收到此錯誤錯誤無法通過引用轉換,裝箱將'System.Collections.Generic.List '類型轉換爲'LinqToTwitter.List'轉換,拆箱轉換,包裝轉換或空類型轉換 – 2012-03-22 13:57:38

+0

看起來你在混合2個不同的對象。由Linq查詢返回的那個:從twitterCtx.Statuswhere中的tweet.Type == StatusType.Friends。你可以在那裏發佈代碼嗎? – 2012-03-22 14:21:50

+0

在數據類公共列表GetFriends(){ 使用(VAR twitterCtx =新TwitterContext(_auth)) { VAR friendTweets =(從twitterCtx.Status鳴叫其中tweet.Type == StatusType.Friends選擇新TweetViewModel {ImageUrl = tweet.User.ProfileImageUrl,ScreenName = tweet.User.Identifier.ScreenName,Tweet = tweet.Text}).ToList(); return friendTweets; < - 返回我不能投它} } – 2012-03-22 14:33:18