ご意見ありがとうございます。
私は MVC アーキテクチャについて学ぼうとしており、プロジェクトの要件よりもツールを学ぶことと同じくらい小さなプロジェクトに取り組んでいます。
私は何が良い、受け入れられる、悪い習慣を構成するのか、そしてその理由を理解する必要があります。特定の正解がないことは十分に理解していますが、良いものからひどいものまでの範囲のいずれかに適合するアーキテクチャが存在するに違いありません。ある意味では 1 つの質問ではありませんが、優れたデザイン プラクティスの論理的な流れが、それらすべてが 1 つのカプセル化された回答に関連付けられることを意味することを願っています。
Darko Pečnik によるCode First メンバーシップ プロバイダーを使用しています
User は、Membership クラスに属するメソッドを介してアクセス/変更する必要がある、主キーやパスワードなどの多くのプロパティを非表示にするインターフェイス IUser を実装します。また、User.Roles Collection ではなく、文字列の配列に getter と setter を使用します。
public virtual String[] RoleNames
{
set
{
this.Roles = (ICollection<Role>)value.Select(r =>
new Role { RoleName = r }).ToList();
質問 1.) このプロパティは悪い習慣ではないかと思いますが、正確な理由はわかりません。これらはメソッド GetRoleNames および SetRoleNames として使用する方がよいでしょうか? それとも Icollection 自体を IUser インターフェイスに含めた方がよいでしょうか?
AutoMapper を使用して IUser からマップされる 2 つの別個のビューモデルが存在します。これらのモデルは、ユーザーが自分自身に関する詳細を登録/更新しているか、または Web サイト管理者によって登録/更新されているかに関連しています。
1 つの viewModel には、役割と部門の IEnumerable が含まれています。これらのプロパティは現在、automapper を介してマッピングされています。
internal class RoleStringArrayToSelectListResolver
: ValueResolver<String[], IEnumerable<SelectListItem>>
{
protected override IEnumerable<SelectListItem> ResolveCore(String[] source)
{
return Roles.GetAllRoles().Select(x => new SelectListItem
{
Value = x,
Text = StringExtensions.ToSeparatedWords(x),
Selected = source.Contains(x)
質問 2.) autoMapper はそのようなロジックを配置するのに適した場所ですか? そうでない場合、どこに配置すべきですか?
質問 3.) ポストバック後、ビジネス ロジックはリポジトリ メソッド createUser および updateUser を介して検証されます。これらのメソッドが IUser インスタンスを引数として受け入れるのが最適でしょうか、それともさまざまなビューモデルを引数として受け入れるいくつかのオーバーロードに適しているのでしょうか。
アイデアを考えてくれて、私の理解を助けてくれてありがとう。