আমার অন্যান্য সত্তা থেকে এএসপি.এনইটি পরিচয় ব্যবহারকারী পৃথক করে


11

আমার কাছে ProjectName.Coreআমার সমস্ত ব্যবসায়িক যুক্তি এবং আমার সত্তা এবং তাদের আচরণ সহ একটি গ্রন্থাগার রয়েছে। সত্তা ফ্রেমওয়ার্ক বা অন্য কোনও ডালের সাথে বর্তমানে কোনও সম্পর্ক নেই কারণ আমি এই জিনিসগুলিকে আলাদা রাখতে পছন্দ করি। সত্তা ফ্রেমওয়ার্ক কনফিগারেশনগুলি (ফ্লুয়েন্ট এপিআই ব্যবহার করে) কোনও ProjectName.Infrastructureপ্রকল্পে থাকে যাতে আমার সত্তাগুলি EF- এ ঠেলাঠেলি করার যত্ন নেয়। মূলত আমি একটি পেঁয়াজের মতো আর্কিটেকচারের দিকে যাচ্ছি।

যাইহোক, মিশ্রণে এএসপি.এনইটি আইডেন্টিটি ফ্রেমওয়ার্ক যুক্ত করার সময়, আমাকে আমার ApplicationUserসত্তাকে IdentityUserশ্রেণীর কাছ থেকে উত্তরাধিকারী করতে হবে তবে আমার ApplicationUserশ্রেণীর সাথে অন্য সত্তার সাথে সম্পর্ক রয়েছে। উত্তরাধিকার সূত্রে IdentityUserআমি আমার সত্তা প্রকল্পে সত্তা ফ্রেমওয়ার্কের একটি রেফারেন্স পরিচয় করিয়ে দিচ্ছি, এমন এক জায়গা যেখানে আমি এটি করতে চাই না। টানা ApplicationUserআউট এর সত্ত্বা প্রকল্প এবং মধ্যে বর্গ Infrastructureপ্রকল্পের (যেহেতু এটি একটি সত্তা ফ্রেমওয়ার্ক ভিত্তিক পরিচয় সিস্টেমটি ব্যবহার করা হয়), সার্কুলার রেফারেন্স পরিণাম ডেকে আনবে যাতে পারেন যেতে উপায় নয়।

এর আশেপাশে কোনও উপায় আছে যাতে আমি এএসপি.এনইটি পরিচয় ব্যবহার না করে দুটি স্তরের মধ্যে পরিষ্কার বিচ্ছিন্ন রাখতে পারি?


1
আপনি কি আপনার মূল প্রকল্পে একটি আইপ্লিকেশন ব্যবহারকারী ইন্টারফেস তৈরি করতে পারবেন না এবং বাস্তবায়ন অবকাঠামোতে রাখতে পারবেন? আমার মতে, আপনি যদি কোনও এপিআই তৈরি না করেন বা রানটাইমের সময় আপনার ইন্টারফেস বাস্তবায়নগুলি অদলবদল করার প্রয়োজন না হয়, কেবল আপনার সমস্ত নন ইউআই কোডকে একটি প্রকল্পে রাখুন। বিভিন্ন প্রকল্পের একগুচ্ছ থাকা আপনার মানসিক এবং কোড পরিচালনাকে খুব বেশি সুবিধা ছাড়াই ওভারহেডে যুক্ত করে।
মর্তালাপেমান

উত্তর:


12

আপনি এমন একটি ব্যবহারকারীর ক্লাস তৈরি করতে পারেন যা আপনার মূল লাইব্রেরিতে এএসপি.নেট পরিচয়ের সাথে কিছুই করার নেই।

public class User {
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    public string EmailAddress { get; set; }
    public string EmailAddressConfirmed { get; set; }
    public string PhoneNumber { get; set; }
    public string PhoneNumberConfirmed { get; set; }
    public string PasswordHash { get; set; }
    public string SecurityStamp { get; set; }

    ...

    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<UserClaim> UserClaims { get; set; }
    public virtual ICollection<UserLogin> UserLogins { get; set; }
}

আপনি যদি সত্ত্বা ফ্রেমওয়ার্ক ব্যবহার করছেন তবে আপনার সত্তার জন্য একটি কনফিগারেশন ক্লাস তৈরি করুন (alচ্ছিক)।

internal class UserConfiguration : EntityTypeConfiguration<User>
{
    internal UserConfiguration()
    {
        ToTable("User");

        HasKey(x => x.UserId)
            .Property(x => x.UserId)
            .HasColumnName("UserId")
            .HasColumnType("uniqueidentifier")
            .IsRequired();

        Property(x => x.PasswordHash)
            .HasColumnName("PasswordHash")
            .HasColumnType("nvarchar")
            .IsMaxLength()
            .IsOptional();

        Property(x => x.SecurityStamp)
            .HasColumnName("SecurityStamp")
            .HasColumnType("nvarchar")
            .IsMaxLength()
            .IsOptional();

        Property(x => x.UserName)
            .HasColumnName("UserName")
            .HasColumnType("nvarchar")
            .HasMaxLength(256)
            .IsRequired();

        // EmailAddress, PhoneNumber, ...

        HasMany(x => x.Roles)
            .WithMany(x => x.Users)
            .Map(x =>
            {
                x.ToTable("UserRole");
                x.MapLeftKey("UserId");
                x.MapRightKey("RoleId");
            });

        HasMany(x => x.UserClaims)
            .WithRequired(x => x.User)
            .HasForeignKey(x => x.UserId);

        HasMany(x => x.UserLogins)
            .WithRequired(x => x.User)
            .HasForeignKey(x => x.UserId);
    }
}

আপনাকে রোল, ইউজারক্লেইম এবং ইউজারলগিনের জন্যও ক্লাস তৈরি করতে হবে । আপনি যদি উপরের নামগুলি পছন্দ না করেন তবে আপনি তাদের নাম চয়ন করতে পারেন।

ওয়েব স্তরে, অ্যাপ্লুউজার নামে একটি শ্রেণি তৈরি করুন (বা যদি আপনি অন্য কোনও নাম চয়ন করেন)। এই শ্রেণীর ASP.NET পরিচয়পত্র বাস্তবায়ন করা উচিত IUser <TKey> ইন্টারফেস, যেখানে TKey (প্রাথমিক কী-এর জন্য ডাটা টাইপ হল GUID উপরোক্ত উদাহরণের)।

public class AppUser : IUser<Guid>
{
    public AppUser()
    {
        this.Id = Guid.NewGuid();
    }

    public AppUser(string userName)
        : this()
    {
        this.UserName = userName;
    }

    public Guid Id { get; set; }
    public string UserName { get; set; }
    public string EmailAddress { get; set; }
    public string EmailAddressConfirmed { get; set; }
    public string PhoneNumber { get; set; }
    public string PhoneNumberConfirmed { get; set; }
    public string PasswordHash { get; set; }
    public string SecurityStamp { get; set; }
}

ওয়েব প্রকল্পের ইউজারম্যানেজারের সমস্ত উল্লেখ ইউজারম্যানেজার <অ্যাপ ইউজার, গাইড> এ পরিবর্তন করুন

অবশেষে, আপনার নিজস্ব ইউজার স্টোর তৈরি করুন । মূলত, কাস্টম ইউজার স্টোরটি অ্যাপস ব্যবহারকারীর অবজেক্টে নেবে , এটি কোনও ব্যবহারকারীর সত্তা অবজেক্টে রূপান্তরিত করবে , তারপরে এটি অবিচল থাকবে। এর মধ্যে একটি পদ্ধতির উদাহরণ নীচে দেখানো হয়েছে:

public class UserStore : 
    IUserLoginStore<AppUser, Guid>, 
    IUserClaimStore<AppUser, Guid>, 
    IUserRoleStore<AppUser, Guid>, 
    IUserPasswordStore<AppUser, Guid>, 
    IUserSecurityStampStore<AppUser, Guid>, 
    IUserStore<AppUser, Guid>, 
    IDisposable
{
    private User MapFromAppUser(AppUser appUser)
    {
        if (appUser == null)
            return null;

        var userEntity = new User();

        PopulateUser(userEntity, appUser);

        return userEntity;
    }

    private void PopulateUser(User user, AppUser appUser)
    {
        user.UserId = appUser.Id;
        user.UserName = appUser.UserName;
        user.EmailAddress = appUser.EmailAddress;
        user.EmailAddressConfirmed = appUser.EmailAddressConfirmed;
        user.PhoneNumber = appUser.PhoneNumber;
        user.PhoneNumberConfirmed = appUser.PhoneNumberConfirmed;
        user.PasswordHash = appUser.PasswordHash;
        user.SecurityStamp = appUser.SecurityStamp;

        // First name, last name, ... 
    }

    #region IUserStore<AppUser, Guid> Members

    public Task CreateAsync(AppUser appUser)
    {
        if (appUser == null)
            throw new ArgumentNullException("appUser");

        var userEntity = MapFromAppUser(appUser);

        // Persist the user entity to database using a data repository.
        // I'll leave this to you.
    }

    ...

    #endregion
}

সম্ভাব্য বাস্তবায়নের সম্পূর্ণ বিবরণ পেতে, এখানে ক্লিক করুন

শেষ পর্যন্ত, এটি আপনার পছন্দ। আপনার কোর লাইব্রেরিতে সনাক্তকরণের কাঠামোটি কেবলমাত্র উল্লেখ করে বনাম এই বাস্তবায়নটি বজায় রাখতে আপনার যে পরিমাণ পরিশ্রম লাগবে তা পরিমাপ করুন। ব্যক্তিগতভাবে, আমি এটি আমার উপরে বর্ণিত পদ্ধতিতে করার চিন্তাভাবনা করেছি, তবে আমি তা করি নি কারণ এএসপি.নেট আইডেন্টিটি ফ্রেমওয়ার্কটি আপডেট হওয়ার পরে প্রতিবারই আমার কোডটি পরিবর্তন করতে হবে।

আশা করি এটি আপনার প্রশ্নের সহায়তা করে এবং উত্তর দেয়!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.