Is it possible to simplify my architecture?

I have just started working on an MVC project and things are going ok but it looks like I am creating alot of spaghetti code with just too many objects. Can anyone see how I can simplify this solution before the whole projects gets out of hand?

ok, here's my set up:

DAL - has Entity framework connections and methods to obtain data then convert the data to my model objects in the model layer

BLL - sends the data back up to the UI Model - this contains all the model objects that are used throughout the site, anything coming from the DAL is converted into these objects by creating a new object then populating the variables.

UI - my MVC solution

The DAL,BLL and Model are also used by other solutions.

Now with MVC, I am trying to use the validation annotations ([Required], etc) which means I have to re-create the model objects with the annotations. This is fine but if I want to save the data back into the database I need to convert the classes which is just messy.

Can anyone see how I can use my current model class library with MVC model objects that use the validation annotations?

If I have not explained myself clearly please let me know and I will provide more details.

Thanks


Ideally there needs to be a separation from the domain models on one hand and MVC models (they are really ViewModels ) on the other hand. This separation is really crucial and strongly advised.

These will look a lot similar in most cases although ViewModel can contain extra stuff. Then you can use AutoMapper to convert from one to the other.

For example:

public class User // in entity DLL
{
    [Required]
    public string Name {get; set;}
}

public class UserViewModel : User // in MVC DLL
{
    public string LastVisitedPage {get; set;} // which only MVC needs to know
}

Mapper.Map<User, UserViewModel>();
Mapper.Map<UserViewModel, User>();

you can put the metadata in metadata objects without recreating the model objects. Here is a very simple way of doing it, however it does require that the model objects themselves are marked as partial. I hope that is OK if not this solution will not work for you.

[MetadataType(typeof(PreviousResultsMetaData))]
public partial class PreviousResults
{
    public class PreviousResultsMetaData
    {
        [DisplayName("Class Ranking Score")]
        [Required]
        [Range(0.0, 100.0)]
        public object ClassRankingScore { get; set; }
    }
}

in the example above there is a data model object called PreviousResults that is created elsewhere by some scaffolding code. It defines the POCO object that is sent to and from database using LINQ. The MetadataType attribute indicates the class that will be used to hold the metadata. Then you simply create plain objects that match the names of your real data members and annotate them.

I hope this helps.


You can use FluentValidation framework for validation. Look here

http://fluentvalidation.codeplex.com/

链接地址: http://www.djcxy.com/p/59190.html

上一篇: 将通道采样从WaveStream转换为阵列

下一篇: 有可能简化我的架构吗?