タグ付けされた質問 「c#」

C#は、Microsoftが.NETプラットフォームと並行して作成した、マルチパラダイムで管理されたガベージコレクションのオブジェクト指向プログラミング言語です。

2
.NETでモノリシックアーキテクチャからマイクロサービスアーキテクチャに切り替える際の重要な考慮事項は何ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 3年前休業。 モノリシックモンスターをマイクロサービスベースのアーキテクチャに徐々に分解することを検討しています。私たちには5つのチームがあり、各チームには2〜3人のC#開発者、少なくとも1人のデータベース開発者、および2人のQAエンジニアが含まれています。モノリシックアーキテクチャからマイクロサービスへの大きな文化とパラダイムシフトに加えて、技術的な課題もあります。同じ間違いをしないように、コミュニティに知恵とアドバイスをお願いしたいと思います。 .NETベースのマイクロサービスが実稼働システムでうまく利用されている良い業界の例はありますか?次の戦略は何でしたか? 組織:.NETソリューション/プロジェクトをどのように編成しましたか? 開発計画:開発計画に関して、チーム間でどのように作業を分割しましたか?マイクロサービス全体で契約のコンプライアンスを確保するための全体的な戦略は、チーム間で交渉されましたか? 負荷分散/ルーティング/ APIゲートウェイ:負荷分散、冗長性、スケーリングの戦略は何でしたか?完全な非同期アーキテクチャを使用して、マイクロサービス通信にキューを使用しましたか、それともロードバランサー/ APIゲートウェイを介してピアツーピアで実行しましたか?なぜ? テスト自動化:テスト自動化をどのように処理しましたか。マイクロサービスアーキテクチャでは、これと継続的な統合が絶対に必要であるようです。どうやってそれをやりましたか? 展開:どのように展開していますか?1つのVM /マイクロサービス、1つのコンテナー/マイクロサービス、またはその他の何か?各マイクロサービスがデータストアを持つことを考慮しなければ、数十のデータベースがあるという事実をどのように処理しましたか?それはインフラストラクチャに何を行い、DBAはそれをどのように処理しましたか? インフラストラクチャ:このアーキテクチャでインフラストラクチャはどのように拡張されましたか。それはとてもおしゃべりで、あなたはそれを微調整する必要がありましたか、それともネットワークが問題なくそれを処理しましたか?セルフホストですか、それともクラウド内ですか? モニタリング:あなたのモニタリング戦略は何ですか?数百のマイクロサービスではないにしても、数十のタブをどのように維持していますか?それは主にロギングと集中監視によるものですか?

2
すべてのメソッドが仮想ではないのか、各クラスに少なくとも1つのインターフェイスがないのはなぜですか?
これは.NETプラットフォームに関するより哲学的な質問ですが、他の言語でも役立つかもしれません。私は多くの単体テストを行っていますが、特に私がしばしば苦労しているサードパーティのコンポーネントを使用している場合はそうです。.NETでは、コンポーネントの設計者に、どのメソッドを仮想化するかどうかを選択するという大きな主張があります。1つはコンポーネントの使用方法(仮想化する意味がある)、もう1つはコンポーネントのモック機能です。Shimsを使用してサードパーティのコンポーネントをモックアップできますが、これは多くの場合、設計や複雑さを悪化させます。.NETでのすべてのメソッドの仮想化(JAVAには最初からあります)についての議論は、パフォーマンスに関するものでした。しかし、それはまだ問題ですか?なぜすべてのメソッドが.NET virtualではないのか、または各クラスに少なくとも1つのインターフェイスがないのはなぜですか?

7
一般的なタスクを実行し、アプリケーション全体から呼び出されるメソッドに静的クラスを使用する必要がありますか?
私は最後の数時間を費やして、staticクラスの使用について読み、それらを使用する必要があるかどうかを理解しようとしましたが、それでも何らかの結論には至っていません。議論はどちらにでも行くことができるようです。私のアプリケーションでは、「ヘルパークラス」と呼ばれるものを作成しました。これには、非常に一般的なタスクを実行し、アプリケーション全体(ASP.Net MVCWebアプリを使用C#)から呼び出されるメソッドが含まれています。簡単な質問は、それらが本当に静的かどうかです。 ? これが私のヘルパーの例です。 public static class ActiveDirectoryHelper { public static PrincipalContext GetPrincipalContext(string ouName) { var fullOUName = string.Concat("OU=", ouName,",DC="); return new PrincipalContext(ContextType.Domain, "", fullOUName, ConfigurationManager.AppSettings["ServiceAccountUser"], ConfigurationManager.AppSettings["ServiceAccountPassword"]); } public static PrincipalSearcher GetAllUsersInOU(string ouName) { var principalContext = GetPrincipalContext(ouName); var userPrincipal = new UserPrincipal(principalContext); return new PrincipalSearcher(userPrincipal); } public static UserPrincipal …

4
依存関係の逆転によりAPIが拡張され、不要なテストが発生する
この質問は数日間私を悩ませてきました、そしてそれはいくつかの実践が互いに矛盾しているように感じます。 例 反復1 public class FooDao : IFooDao { private IFooConnection fooConnection; private IBarConnection barConnection; public FooDao(IFooConnection fooConnection, IBarConnection barConnection) { this.fooConnection = fooConnection; this.barConnection = barConnection; } public Foo GetFoo(int id) { Foo foo = fooConection.get(id); Bar bar = barConnection.get(foo); foo.bar = bar; return foo; } } これをテストするとき、IFooConnectionとIBarConnectionを偽造し、FooDaoをインスタンス化するときに依存性注入(DI)を使用します。 機能を変更せずに実装を変更できます。 …

3
10以上のプロジェクト間でコードベースを共有し、痛みを最小限に抑える方法は?
同じデータベースで同じデータを共有するアプリケーションがいくつかあります。コードの冗長性を最小限に抑えるために、データアクセス層は共有プロジェクトです。これにより、各プロジェクトが独自のデータアクセスを再コーディングする必要がなくなりますが、これも大きな問題になります。1つのチームがデータレイヤーを更新する必要がある場合、他のすべてのチームは変更をプルしてテストし、変更が何も壊れていないことを確認する必要があります。これは遅くて苦痛なプロセスです。 共有データレイヤーを削除し、各チームに独自のデータレイヤーを管理させるというアイデアについて考えましたが、問題は、すべてのチームが同じデータベースにアクセスするため、テーブルの変更がある場合でも、すべてのチームが関連するコードを更新します。 だから私の質問は、多くのプロジェクトが同じデータソースから追​​い出され、データベースまたはアクセスレイヤーへの変更の痛みを最小限に抑えるように、データとアクセスレイヤーをどのように設計できるでしょうか。

5
設計パターンのオープンクローズの原則
オープンクローズの原則を実際にどのように適用できるかについて、少し混乱しています。時間の経過とともにビジネスの要件は変化します。Open-Closedの原則に従って、既存のクラスを変更する代わりにクラスを拡張する必要があります。クラスを延長するたびに、要件を満たすのは現実的ではないように思えます。列車予約システムの例を挙げましょう。 列車予約システムでは、チケットオブジェクトがあります。通常のチケット、割引チケットなど、さまざまなタイプのチケットが存在する可能性があります。チケットは抽象クラスで、RegularTicketとConcessionTicketsは具象クラスです。すべてのチケットには共通のPrintTicketメソッドがあるため、基本抽象クラスであるチケットで記述されます。これが数か月間うまくいったとしましょう。ここで、チケットのフォーマットを変更するように要求する新しい要件が発生します。印刷されたチケットにいくつかのフィールドが追加されるか、形式が変更される場合があります。この要件を満たすために、次のオプションがあります チケット抽象クラスのPrintTicket()メソッドを変更します。しかし、これは開閉原理に違反します。 子クラスのPrintTicket()メソッドをオーバーライドしますが、これは印刷ロジックを複製します。これは、DRY(自分を繰り返さないでください)の原則に違反しています。 だから質問は オープン/クローズの原則に違反せずに、上記のビジネス要件を満たすにはどうすればよいですか。 クラスが変更のために閉じられることになっているとき?クラスが変更のために閉鎖されていると見なすための基準は何ですか?それは、クラスの初期実装後ですか、それとも本番環境での最初のデプロイメント後か、それとも別の場合があります。

7
単一の日付と日付範囲の両方を表すことができるプロパティ:適切にモデル化する方法は?
私は2つの方法で「送料見積もり」を表すことができるシステムで働いています。 特定の日付:アイテムはその日付で出荷されることが保証されています 日間隔:アイテムは今日から「X to Y」日で発送されます モデルに関する情報は、意味的には同じで、「発送予定」です。配送見積もりの​​情報をシステムから取得すると、見積もりが最初の形式か2番目の形式かがわかります。 このための現在のモデルは次のようになります。 class EstimattedShippingDateDetails { DateTime? EstimattedShippingDate {get; set;} Range? EstimattedShippingDayRange {get; set;} } Range 整数の「始まり->終わり」をラップする単純なクラスです。 struct Range { int Start {get; set} int End {get; set} public override ToString() { return String.Format("{0} - {1}", Start, End); } } 推定モデルのプロパティの1つだけが入力されるため、このアプローチは好きではありません。一方のプロパティでnullをテストし、もう一方のプロパティにデータがあると仮定する必要があります。 各プロパティは、ユーザーには異なる方法で表示されますが、現在のスイッチングロジックが存在するカスタムMVC DisplayTemplateを使用して、UIの同じ場所に表示されます。 @Model EstimattedShippingDateDetails @if …

1
モデルは使用せず、ビューモデルのみ
私は新しいMVC 5プロジェクトをゼロから始めています。私はEF 6(Database First)とIdentity 2.0を使用しています。 私のソリューションは、3つの異なるプロジェクトで構成されています。データ(.edmxと私のDBコンテキストがある場合)、リソース(ローカライズ目的)、およびWeb(Webプロジェクト自体)です。 デフォルトでは、すべてのビューにViewModelsを使用しています。新しいビューを作成するたびに、最初に行うのはViewModelを追加することです(ViewModelがそれらのビューに接続されている場合、それらをすべて同じファイルに保持します。たとえば、AccountViewModelに保持するユーザーアカウントに関連するすべてのViewModelを保持します)。 。これまでのところ、これにより状況が非常にシンプルになり、以前に抱えていたいくつかの問題が解決されました。 しかし、私は疑問に思っています、モデルを使用することはまったく意味がありますか?現在使用しているのはIdentityの1つだけです。これはデフォルトで作成され、Identityに固有で必要なApplicationUserとApplicationDbContextが含まれています。それ以外は、すべてViewModelsです。 データプロジェクトは、アプリケーションの「モデル」と見なされますか?したがって、私は実際にモデルを使用しています。それは、Web \ Modelsに保持する一連のクラスではなく、「モデル」(エンティティによって作成されたBLオブジェクト)が格納される別個のプロジェクトです。そう思いますが、よくわかりません。 これは正しいアプローチですか、それとも将来的に問題が発生する可能性がありますか?これはWebプログラミングへの私の最初の取り組みなので、アドバイスをいただければ幸いです。
8 c#  .net  mvc  asp.net  asp.net-mvc 

3
独自の例外を作成する必要がありますか、それともわずかに非標準的な目的で同様の例外を選択する必要がありますか?
これは一般的なデザインの質問ですが、私がC#と.NETに焦点を合わせています。これは、これらが現在使用している言語だからです。 独自の新しい例外クラスを作成する必要がありますか、それともわずかに異なる目的で既存のフレームワーク例外を選択する必要がありますか? たとえば、メンバ(つまり、型など)が予期されていたが、を使用してアセンブリを読み取っているときに見つからなかったことを示す例外が必要であることがわかりましたMono.Cecil。基本クラスライブラリは例外を定義しますMissingMemberException。これは、私が欲しいものを正確に伝えているようですが、説明では次のように述べています。 存在しないクラスメンバーに動的にアクセスしようとした場合にスローされる例外。 メンバーに動的にアクセスするのではなく、アセンブリを受動的に操作するため、これは正確には適合しません。

1
C#を使用してクロスプラットフォームアプリケーション(MacおよびWindows)を作成できますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 この質問に関する多くの古い情報とInterwebsの周りを飛んでいる多くの記事を見ていますが、物事がどこにあるのかははっきりとわかりません。 基本的に、ネイティブのWindowsアプリケーションにコンパイルしたり、ネイティブのMacアプリケーション(ParallelsやWineなど)にコンパイルしたりできるC#コードを記述したいと思います。これはできますか? Xamarinのような製品は進むべき道ですか?XamarinのWebサイトでは、「同じ言語、API、データ構造を使用して、すべてのモバイル開発プラットフォームで平均75%のアプリコードを共有しています」と述べています。しかし、プラットフォーム固有の25%のアプリコードが何を必要とするのかはわかりません。また、OSXとWindowsをターゲットにしているのかどうかもわかりません。彼らのWebサイトはモバイルデバイス中心です。 [後で追加] 概要:Xamarinはクロスプラットフォームアプリケーションを作成するようには設計されていません。MacaのGUI操作を使用して、C#でMacアプリケーションを作成する方法が提供されます。彼らが推奨するのは、すべての「ビジネスロジック」クロスプラットフォームを記述してから、2つの完全に別個のGUIを記述することです。1つはWindows用、もう1つはMac用です。 C#/ Qtは非常に初期の段階にあるようです(2016年以降にこの記事を誰かが見つけた場合は、チェックしてください)。 monoはGUIを含むクロスプラットフォームを実行するようですが、Windowsフォームを使用する場合のみです。

2
大規模なルックアップテーブルによるユニットテスト?
私たちのシステムは、計算やその他のロジックの多くの重要な情報をルックアップタイプテーブルから取得できるように構成されています。例としては、すべての種類の異なるレート(金利や拠出率など)、日付(有効日など)、およびすべての種類のさまざまなその他の情報があります。 なぜ彼らはすべてをこのように構成することに決めたのですか?この情報の一部はかなり頻繁に変更されるためです。たとえば、料金の一部は毎年変動します。彼らは、コードの変更を最小限に抑えることを試みました。期待は、ルックアップテーブルが変更され、コードが機能することだけです(コードの変更はありません)。 残念ながら、それは単体テストを困難にするだろうと思います。一部のロジックでは、100以上の異なるルックアップが行われる場合があります。私は間違いなく私たちのレートを返すモック可能なオブジェクトを作ることができますが、かなりのセットアップになるでしょう。私はそれか、統合テストを使用する(そしてそのデータベースにアクセスする)必要があると思います。私は正しいですか、それとももっと良い方法がありますか?助言がありますか? 編集: 応答が遅れて申し訳ありませんが、私は同じことで他の多くのものをジャグリングしながら、すべてを浸そうとしました。また、実装を同時に実行したいと思いました。私はさまざまなパターンを試して、満足できる解決策を構築しました。満足できないビジターパターンを試してみました。結局、私はオニオンアーキテクチャを使用することになりました。結果に満足しましたか?ちょっと。それが何かだと思います。ルックアップテーブルを使用すると、はるかに困難になります。 以下は、毎年変化するレートのテスト用のセットアップコードの小さな例です(imはfakeiteasyを使用しています)。 private void CreateStubsForCrsOS39Int() { CreateMacIntStub(0, 1.00000m); CreateMacIntStub(1, 1.03000m); CreateMacIntStub(2, 1.06090m); CreateMacIntStub(3, 1.09273m); CreateMacIntStub(4, 1.12551m); CreateMacIntStub(5, 1.15928m); CreateMacIntStub(6, 1.19406m); CreateMacIntStub(7, 1.22988m); CreateMacIntStub(8, 1.26678m); CreateMacIntStub(9, 1.30478m); CreateMacIntStub(10, 1.34392m); CreateMacIntStub(11, 1.38424m); CreateMacIntStub(12, 1.42577m); CreateMacIntStub(13, 1.46854m); CreateMacIntStub(14, 1.51260m); CreateMacIntStub(15, 1.55798m); CreateMacIntStub(16, 1.60472m); CreateMacIntStub(17, 1.65286m); CreateMacIntStub(18, 1.70245m); CreateMacIntStub(19, 1.75352m); …

4
静的クラスの有効な用途は何ですか?
C#などのオブジェクト指向言語で静的クラスを使用しているプログラマーを目にするたびに、彼らが間違っていることに気づきました。主な問題は明らかにグローバルな状態であり、実行時に、またはテスト中にモック/スタブを使用して実装を交換することの難しさです。 好奇心から、十分にテストされたプロジェクトを選択するプロジェクトのいくつかを見て、実際にアーキテクチャとデザインについて考えようと努力しました。私が見つけた静的クラスの2つの使用法は次のとおりです。 ユーティリティクラス— このコードを今日作成している場合は避けたいものですが、 アプリケーションキャッシュ:そのための静的クラスの使用は明らかに間違っています。MemoryCacheまたはRedis に置き換えたい場合はどうなりますか? .NET Frameworkを見ると、静的クラスの有効な使用例も見当たりません。例えば: File静的クラスを使用すると、代替クラスに切り替えるのが非常に困難になります。たとえば、分離ストレージに切り替えるか、ファイルをメモリに直接格納する必要がある場合、またはNTFSトランザクションをサポートできる、または少なくとも259文字を超えるパスを処理できるプロバイダーが必要な場合はどうでしょうか。持つ共通のインタフェースと複数の実装は、使用して同じように簡単現れるFileコードベース要件の変更のほとんどを書き換えることではないの恩恵で、直接。 Console静的クラスはテストを非常に複雑にします。ユニットテスト内で、メソッドが正しいデータをコンソールに出力することをどのように確認すべきですか?Stream実行時に注入される書き込み可能に出力を送信するようにメソッドを変更する必要がありますか?非静的コンソールクラスは、静的クラスと同じくらい単純で、静的クラスのすべての欠点がないように思われます。 Math静的クラスも適切な候補ではありません。任意精度の演算に切り替える必要がある場合はどうなりますか?それとも、より新しく、より高速な実装ですか?または、単体テスト中にMathクラスの特定のメソッドが実際にテスト中に呼び出されたことを通知するスタブに? Programmer.SEで、私は読んだ: C#で「静的」を使用しないでください。一部の回答は、静的クラスに完全に反しています。他の人は、「静的メソッドは使用しても問題がなく、プログラミングで正当な場所がある」と主張しますが、引数でそれを焼き付けないでください。 シングルトンを使用する場合と静的クラスを使用する場合。ユーティリティクラスには問題があると上記で述べたので、ユーティリティクラスについて説明します。 なぜ、いつクラスを「静的」にする必要がありますか?クラスの「静的」キーワードの目的は何ですか?言及されている唯一の有効な使用法は、拡張メソッドのコンテナです。すごい。 拡張メソッドとは別に、静的クラスの有効な用途は何ですか。つまり、依存性注入またはシングルトンが不可能であるか、設計の品質が低下し、拡張性と保守が難しくなる場合ですか。

1
同じWebプロジェクト内のWebフォームとMVC
私はASP.NET Webフォームを使用して構築された大規模なレガシープロジェクトで作業しており、同じプロジェクトにMVCライブラリを追加するという考えはあちこちに放棄されています。私はこれが可能であることを知っています(たくさんの記事が利用可能です)が、同様のことをした人がこれを推奨するのかどうか、またなぜ推奨しないのか疑問に思っています。 新しいMVCパターンを使用してアプリケーションの新しい領域を構築し、レガシーページを常に実行し続けることができるという考えです。 編集:明確にするために、MVPパターンはこのプロジェクトの一部ですでに使用されているので考慮していませんが、この記事で説明されているものと同様のことをしています:https : //www.simple-talk.com/dotnet/ asp.net/mixing-web-forms-and-asp.net-mvc/

4
C#のソフトリアルタイムコードに対してどのような最適化を行うことができますか?
C#でソフトリアルタイムアプリケーションを作成しています。ネットワークからのハードウェア要求への応答などの特定のタスクは、特定のミリ秒以内に完了する必要があります。ただし、そうすることは100%ミッションクリティカルではありません(つまり、ほとんどの時間に時間どおりにあることを許容でき、1%は望ましくありませんが失敗ではありません)。したがって、「ソフト」な部分です。 C#はマネージ言語であり、マネージ言語はリアルタイムアプリケーションには特に適していません。ただし、C#で物事を成し遂げることができる速度、およびリフレクションやメモリ管理などの言語機能により、このアプリケーションを構築するタスクがはるかに簡単になります。 オーバーヘッドの量を減らして確定性を高めるために実行できる最適化または設計戦略はありますか?理想的には私は次の目標を持っているでしょう 「安全」になるまでガベージコレクションを遅らせる ガベージコレクターがリアルタイムプロセスに干渉することなく動作できるようにする さまざまなタスクのスレッド/プロセスの優先順位 C#でこれらを行う方法はありますか、C#を使用するときにリアルタイムに関して他に注意する点はありますか? アプリケーションのプラットフォームターゲットは、Windows 7 64ビットの.NET 4.0クライアントプロファイルです。現在はクライアントプロファイルに設定していますが、これはデフォルトのオプションであり、特別な理由で選択されませんでした。

4
インターフェイスの拡張メソッドをinterface.csファイルに含める必要がありますか?
この設定を想像してください: public interface IMass{ double Mass {get;} } public static class IMassExtension { public static double ToKg(this IMass massObject) { return massObject.Mass / 1000.0; } public static double CalculateInteractiveGravity(this IMass massObject, IMass otherMassObject) { return blah; } } 拡張クラスをインターフェースと同じファイル(つまり、IMass.cs)に配置してもよいですか、それとも別のファイル(IMassExtension.cs)に配置する必要がありますか? ここでは基本クラスは使用できません。想像してみて public class Person : Animal, IMass {} そして public class …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.