2012-03-21 6 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()置く:私はものの多くを貼り付けた場合、私は持っていけない、適切なアプリを設計し、作るしようとしています

申し訳ありませんが私はこれらの落とし穴を打つことができることを知っていたので、私の論理を全面的にやり直す。

これを解決する助けを得ることができますか?私はこれが複雑なシナリオだとは思わない。

ヘルプが必要な場合は、他の人の回答を修正しました。ありがとうございました!!あなたがMVCAuthorizerを注入どこ

ただ、データクラス

 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

を助け

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); 

}

希望。 'TwitterFriend'クラスではそうではありません。 – veblock

答えて

0

は、Twitterの友人のクラスにコンストラクタを追加します。

パブリッククラスTwitterFriendService {

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

_auth = auth; 
} 

公衆リストGetFriends(){

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

するvar friendTweetsの=(tweet.Type == StatusType.Friends twitterCtx.Statusにツイートから新しいTweetViewModelを選択してください { ImageUrl = tweet.User.ProfileImageUrl、 ScreenName = tweet.User.Identifier.ScreenName、 Tweet = tweet.Text }) 。ToList();

と、コントローラ上の

return friendTweets; 
} 

}:これは、あなたの `MvcAuthorizer`オブジェクトを初期化部分で

+0

ありがとう、サービスコンテキストでこのエラーが発生しました。エラー参照変換、ボクシングを介して 'System.Collections.Generic.List 'を 'LinqToTwitter.List'に変換できません変換、アンボックス変換、折り返し変換、またはヌル型変換 –

+0

2つの異なるオブジェクトが混在しているようです。 Linqクエリから返されたもの:twitterのtweetから.Statuswhere tweet.Type == StatusType.Friends。それが起こっているところでコードを投稿できますか? (VAR twitterCtx =新しいTwitterContext(_auth))を使用して、データクラス公開リストGetFriendsで –

+0

(){ {VARのfriendTweetsの=(tweet.Type == StatusType.Friends新しいTweetViewModelを選択twitterCtx.Statusにツイートから{ImageUrl = tweet.User.ProfileImageUrl、ScreenName = tweet.User.Identifier.ScreenName、Tweet = tweet.Text}).ToList(); return friendTweets; <戻る返すことはできません。 } } –

関連する問題