PDA

View Full Version : نوشتن برنامه دیتابیسی مبتنی بر پلاگین (plugin base)



vb8334
یک شنبه 31 فروردین 1393, 23:02 عصر
سلام

دوستان من یه برنامه دارم مینویسم که مبتنی بر پلاگین هستش ببینید کلآ قضیه اینه که یه دیتابیسی داریم که لیست مشتری داره نام و ...
برنامه های مبتنی بر پلاگین یه قسمت هاست داره و تعریف پلاگین که همون اینترفیس و غیره رو تعریف میکنیم و پلاگینی که برای این پروژه نوشته میشه قراره اطلاعاتی که از دیتابیس
میاد رو حساب و کتاب کنه فرض کنید 4 نفر هستند که میخوان 4 پلاگین بنویسن برای این برنامه یکی مثلآ تعداد مشتری ها رو بدست میاره و پلاگین دوم بدهی ها رو حساب میکنه و...


مشکل من اینجاست چطوری میتونم حالا لیست مشتری ها در ورودی اینترفیس هام بدم و کسایی که دارن پلاگین مینویسن درگیر دیتابیس نشن و فقط اطلاعات رو از ورودی اینترفیس ها بگیرن و
کاری که میخوان رو انجام بدن.

namespace PluginBasdeApp.PluginDefenition{
public interface IPlugin
{
string Name { get; }


List<IAction> Actions { get; }


}
}


namespace PluginBasdeApp.PluginDefenition{
public interface IAction
{
string Name { get; }

List<Customer> Run(List<Customer> customers );
}
}


باتشکر

vb8334
دوشنبه 01 اردیبهشت 1393, 11:38 صبح
دوستان کسی نیست به سوال من جواب بده؟

plus
دوشنبه 01 اردیبهشت 1393, 11:50 صبح
اگه به صورت خیلی محدود و ساده میخواین بنویسین و فقط با لیست مشتری ها سرو کار دارین، همین متد Run که تعریف کردین میتونه مناسب باشه.
در لود Engine، لیست مشتری ها لود میشه (مثلا به صورت <IList<Customer) و هر Plugin ی که توسط Engine اجرا میشه این لیست رو دریافت میکنه...البته در این مدل، تغییر لیست مشتری ها در نظر گرفته نشده.
اگه سناریو رو کامل تر توضیح بدین شاید بشه کمک بیشتری کرد (و اینکه هدف آموزشی هست یا محصول تجاری).

vb8334
دوشنبه 01 اردیبهشت 1393, 13:35 عصر
هدف آموزشی هستش و منظورتون رو از لود
Engine نفهمیدم میشه بیشتر توضیح بدید.

ببینید خود پلاگینی که developer میسازه که نمیتونه اجرا کنه ببینه برنامه کار میکنه یا یعنی منظورم اینکه پلاگین developer باید به برنامه اصلی اضافه بشه تا نتیجه دیده بشه

یه چیزی رو دقیقآ نیمدونم الان تا زمانی که پروژه اصلی اجرا نشه عملآ مشخص نمیشه پلاگینی که developer نوشته درست کار میکنه یا نه؟

چطوری پس developer باید پلاگین رو بنویسه زمانی که تو همون لحظه که داره مینویسه اطلاعاتی از مشتری ها نداره؟

یعنی اینکه همانطور که میبینید زمانی که من برنامه رو اجرا کنم با رسیدن به act.run مقدار داخل اون run توی اینترفیس ها هم پر میشه پس فقط در لحظه اجرا ما لیست مشتری

ها رو داریم من دقیقآ توی همینجا مشکل دارم

کد برنامه اصلی رو انجوری نوشتم:


private void Form1_Load(object sender, EventArgs e) {
var dllFiles = Directory.GetFiles("plugins", "*.dll");




foreach (var dllFile in dllFiles)
{


var asm = Assembly.LoadFrom(dllFile);


foreach (var t in asm.GetTypes())
{
if (t.GetInterface("IPlugin") != null)
{
var plugin = Activator.CreateInstance(t) as IPlugin;


var menu = new System.Windows.Forms.ToolStripMenuItem();
menu.Text = plugin.Name;
foreach (var act in plugin.Actions)
{
var actionItem = new System.Windows.Forms.ToolStripMenuItem();
actionItem.Text = act.Name;
menu.DropDownItems.Add(actionItem);
actionItem.Click += (ss, ee) =>
{
act.Run(GetCustomers());
};
menuStrip1.Items.Add(menu);


}
}
}
}
}




private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}




public List<Customer> GetCustomers()
{
SqlConnection connection = new SqlConnection("Database=Customers;Server=localhost;Integrated Security=True");
connection.Open();
//SqlCommand myCommand=new SqlCommand("SELECT * FROM Customer",connection);


//dataGridView1.DataSource = myCommand.ExecuteNonQuery();
SqlDataReader myreader = null;


SqlCommand cmd = new SqlCommand("SELECT * FROM Customer", connection);


cmd.CommandType = CommandType.Text;


SqlDataAdapter sqlData = new SqlDataAdapter(cmd);


DataSet ds = new DataSet();


sqlData.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
var customer = new Customer();
List<Customer> lst = new List<Customer>();
for (int rows = 0; rows < dataGridView1.Rows.Count; rows++)
{
if (rows == 6)
break;


customer.Id = (int)dataGridView1.Rows[rows].Cells["ID"].Value;
customer.Name = dataGridView1.Rows[rows].Cells["Name"].Value.ToString();
customer.Debit = (int)dataGridView1.Rows[rows].Cells["Debit"].Value;
customer.Age = (int)dataGridView1.Rows[rows].Cells["Age"].Value;
customer.Mail = dataGridView1.Rows[rows].Cells["Mail"].Value.ToString();


lst.Add(customer);
}


connection.Close();


return lst;

}

plus
دوشنبه 01 اردیبهشت 1393, 14:09 عصر
هدف آموزشی هستش و منظورتون رو از لود [RIGHT]Engine نفهمیدم میشه بیشتر توضیح بدید.

ببینید خود پلاگینی که developer میسازه که نمیتونه اجرا کنه ببینه برنامه کار میکنه یا یعنی منظورم اینکه پلاگین developer باید به برنامه اصلی اضافه بشه تا نتیجه دیده بشه

یه چیزی رو دقیقآ نیمدونم الان تا زمانی که پروژه اصلی اجرا نشه عملآ مشخص نمیشه پلاگینی که developer نوشته درست کار میکنه یا نه؟

چطوری پس developer باید پلاگین رو بنویسه زمانی که تو همون لحظه که داره مینویسه اطلاعاتی از مشتری ها نداره؟
[COLOR=#333333]
یعنی اینکه همانطور که میبینید زمانی که من برنامه رو اجرا کنم با رسیدن به act.run مقدار داخل اون run توی اینترفیس ها هم پر میشه پس فقط در لحظه اجرا ما لیست مشتری

ها رو داریم من دقیقآ توی همینجا مشکل دارم
خوب طبیعیه که لیست -واقعی- مشتری ها فقط در زمان اجرای Plug-In برای اون موجود هست.ولی در مورد اینکه میگین "خود پلاگینی که developer میسازه که نمیتونه اجرا کنه ببینه برنامه کار میکنه یا نه" قرار نیست که Develper برای تست لیست واقعی رو داشته باشه.مگه هر نرم افزاری که تست میشه، در موقع تست داده های واقعی رو داره؟
ِDeveloper میتونه با هر لیست تستی دیگه Plug-in ش رو تست کنه.(مثلا لیستی ساختگی از Customer ها...).
در این مورد در مهندسی نرم افزار موضوع Testing و Mock Objectمطرح هست میتونید جستجو کنید.