使用相同的接口在层DAL和Web Service之间切换

时间:2013-12-18 13:13:17

标签: c# wcf web-services interface

我有一个新的应用程序,我需要在本地(局域网)和Web上分发它。 但是,我需要在两种环境中保持性能的安全性和质量。

起初,我想:

Idea about layers

所以我想我会在类库,数据访问,接口/合同层和中间层中分离我的应用程序层。 应用程序将在直接使用DAL或WebService进行选择的中间层。

所以,我有:

模型层:

using System.Runtime.Serialization;

namespace Model
{
    [DataContract]
    public class Car
    {
        [DataMember]
        public int Id { get; set; }

        [DataMember]
        public string Name { get; set; }
    }
}

接口/合同层:

using System.ServiceModel;

namespace Contracts
{
    [ServiceContract]
    public interface ICarContract
    {
        [OperationContract]
        Model.Car Get(int carId);
    }
}

数据访问层(DAL):

using System.Linq;

namespace DAL
{
    public class CarRepository : Contracts.ICarContract
    {
        public Model.Car Get(int carId)
        {
            var ctx = new Context();
            try
            {
                return ctx.Cars.First(x=>x.Id == carId);
            }
            finally
            {
                ctx.Dispose();
            }
        }
    }
}

using System.Data.Entity;

namespace DAL
{
    public class Context : DbContext
    {
        public DbSet<Model.Car> Cars { get; set; }
    }
}

WebService,在IIS中托管的WCF WebService中:

using System;

namespace WSL
{
    public class CarService : Contracts.ICarContract
    {
        public Model.Car Get(int carId)
        {
            return new DAL.CarRepository().Get(carId);;
        }
    }
}

WinForms应用程序:

using System;
using System.Windows.Forms;

namespace WFApp
{
    public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();
        }

        private void GetButtom_Click(object sender, EventArgs e)
        {
            int carId = Convert.ToInt32(carIdTextBox.Text);
            var rep = new IntermediateLayer.Car();
            var car = rep.Get(carId);
            carNameTextBox.Text = car.Name;
        }
    }
}

最后,中间层:

using System;

namespace IntermediateLayer
{
    public class Car : Contracts.ICarContract
    {
        public Model.Car Get(int carId)
        {
            ?????
        }
    }
}

嗯,这一切都是为了表明希望保持表现层/视图/表格,改变中间层。

我的问题是:这可能吗?怎么做到这个? 这是一个好习惯吗?没有?你怎么建议我解决这个问题?非常感谢!

0 个答案:

没有答案